开发者

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

开发者 https://www.devze.com 2022-12-16 11:27 出处:网络
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 th开发者_Go百科eir previo

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 th开发者_Go百科eir 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);
}


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.


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消