Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Swing: dispose() a JFrame does not clear its controls

Tags:

java

swing

jframe

I have a closeWindow() method which uses dispose() for the current JFrame to close down. When I show the window again, the controls (textboxes, lists, tables etc.) still have their previous values in place that were there when I dispose():d the frame... Why is that? Is there another way to completley close and clear a frame?

This is the code that another JFrame uses to show the other window, am I doing something wrong here?

@Action
public void showAddProductToOrderView() {

    if (addProductToOrderView == null) addProductToOrderView = new AddProductToOrderView(this);
    addProductToOrderView.setVisible(true);
}
like image 390
Johan Avatar asked Feb 27 '23 19:02

Johan


2 Answers

Disposing a window will not clear its child text components. Dispose will release native resources. The javadoc for java.awt.Window also states:

The Window and its subcomponents can be made displayable again by rebuilding the native resources with a subsequent call to pack or show. The states of the recreated Window and its subcomponents will be identical to the states of these objects at the point where the Window was disposed (not accounting for additional modifications between those actions).

As suggested by others, create a new instance each time instead. If that's to expensive I believe your best option is to clear sub components when the view becomes visible, e.g. by overriding setVisible.

EDIT: Remove the null check to create a new frame each time.

@Action
public void showAddProductToOrderView() {
    addProductToOrderView = new AddProductToOrderView(this);
    addProductToOrderView.setVisible(true);
}

I don't know about the rest of your code, if there's something else depending on the frame being reused. For example, if you have attached listeners, ensure they are unregistered to not leak them.

like image 92
Samuel Sjöberg Avatar answered Mar 03 '23 16:03

Samuel Sjöberg


The simplest thing to do would be to re-create the whole frame (using its constructor) before using show() to show it again. That will give you a whole new set of components, assuming that the constructor creates and places them.

like image 21
Carl Smotricz Avatar answered Mar 03 '23 14:03

Carl Smotricz