【问题标题】:Java Swing: dispose() a JFrame does not clear its controlsJava Swing:dispose() 一个 JFrame 不清除它的控件
【发布时间】:2010-01-10 13:35:41
【问题描述】:

我有一个 closeWindow() 方法,它使用 dispose() 来关闭当前的 JFrame。当我再次显示窗口时,控件(文本框、列表、表格等)仍然具有它们以前的值,这些值在我 dispose():d 框架时就在那里......这是为什么呢?还有其他方法可以完成关闭和清除框架吗?

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

@Action
public void showAddProductToOrderView() {

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

【问题讨论】:

  • 如果你看到我上面添加的代码,在 dispose():d 之后 addProductToOrderView 不是 null 吗?如何确保变量被清除?

标签: java swing jframe


【解决方案1】:

释放窗口不会清除其子文本组件。 Dispose 将释放本机资源。 java.awt.Window 的 javadoc 还指出:

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

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

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

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

我不知道您的其余代码是否还有其他内容,具体取决于被重用的框架。例如,如果您附加了侦听器,请确保它们未注册以免泄漏。

【讨论】:

  • 谢谢!如果您查看上面的代码,如果变量为空,那不是每次都会创建一个新实例吗?我想 dispose() 不会渲染变量 null 吗?如何在每次创建新实例之前清除该变量?
  • 除非您自己在代码中的某个位置执行此操作,否则该变量不会设置为 null。处理框架只会释放其本机资源(WindowPeer 等),不会影响对对象的引用。每次删除空检查以创建一个新实例。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2014-06-03
    相关资源
    最近更新 更多