Java Swing:dispose()JFrame不会清除它的控件

时间:2010-01-10 13:35:41

标签: java swing jframe

我有一个closeWindow()方法,它使用dispose()来关闭当前的JFrame。当我再次显示窗口时,控件(文本框,列表,表格等)仍然具有它们之前的值,当我处理()时:框架......为什么会这样?是否有另一种方法来完成关闭和清除框架?

这是另一个JFrame用来显示另一个窗口的代码,我在这里做错了吗?

@Action
public void showAddProductToOrderView() {

    if (addProductToOrderView == null) addProductToOrderView = new AddProductToOrderView(this);
    addProductToOrderView.setVisible(true);
}

2 个答案:

答案 0 :(得分:5)

处理窗口不会清除其子文本组件。 Dispose将释放本机资源。 java.awt.Window的javadoc也声明:

通过随后调用pack或show重建本机资源,可以再次显示Window及其子组件。重新创建的窗口及其子组件的状态将与窗口处置点处的这些对象的状态相同(不考虑这些操作之间的其他修改)。

正如其他人所建议的那样,每次都要创建一个新实例。如果这是昂贵的,我相信你最好的选择是在视图变得可见时清除子组件,例如通过覆盖setVisible

编辑: 删除空检查以每次创建一个新帧。

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

我不知道你的其余代码,如果还有别的东西取决于重用的框架。例如,如果您已连接侦听器,请确保它们未注册,以免泄露它们。

答案 1 :(得分:3)

最简单的方法是在使用show()再次显示之前重新创建整个框架(使用其构造函数)。这将为您提供一组全新的组件,假设构造函数创建并放置它们。