【问题标题】:Why does this way of retrieving fields from a destroyed JDialog work?为什么这种从被破坏的 JDialog 中检索字段的方式有效?
【发布时间】:2015-04-13 23:57:31
【问题描述】:

上下文

想了解如何使用自定义JDialogs 进行重要的、经过验证的数据输入,我搜索并找到了一个与密切相关的问题的interesting answer

我不明白为什么提供的答案中的代码有效。

我的问题

由于JDialog 对象已在其匿名actionPerformed() 方法中执行setVisible(false)dispose() dispose() 匿名ActionListener,当调用者返回程序流并尝试获取字段时,不应该垃圾收集器已经销毁了这个字段?

【问题讨论】:

    标签: java swing scope jdialog


    【解决方案1】:

    dispose 只会处理对话持有的本机对等资源。如果您仍然有对有问题的JDialog 的引用,那么它将不符合垃圾收集的条件,因为您仍然对它有很强的引用。我假设您仍然有对对话框的引用,因为否则,您将如何尝试获取由它管理的值...

    垃圾收集也不会立即发生......

    根据您的链接问题...

    FObjectDialog fod = new FObjectDialog(this);
    //...
    String name = fod.getName();
    

    仍然强烈引用FObjectDialogfod。因此,直到fod 脱离上下文(方法返回)、被取消引用(fod = null;)或被重新分配,fod(以及扩展的对话框)都没有资格进行垃圾回收。

    【讨论】:

    • 再次嗨 :)。当然都是参考!!来自 C++ 背景,我仍然很难习惯让 JVM “以智能方式”管理我的内存。另一方面,我知道 GC 可能需要一段时间,但它似乎仍然有点不安全。我想我不清楚“本地对等资源”意味着什么。
    • @MHaaZ 检查更新。所有 Swing 组件共享一个通用的本地对等点(它与每个窗口相关联),它是 Swing API 和操作系统之间的连接,并允许 Swing 执行诸如绘画等操作。允许窗口处理这些资源允许系统释放内存,并且当您可能想要再次重用窗口时很有用(类似于JFileChooser),因为重新创建本机对等点比它更快。对象(有时)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多