【发布时间】:2014-03-27 14:07:36
【问题描述】:
我已经尝试四处寻找这个问题,我想它一定是在某个时候被问到的,但这是我能找到的最接近的东西 Remove Top-Level Container on Runtime。
我的问题是,在 JDialog 中调用 dispose() 之后,如果 dispose 在 try 中完成并且执行代码在 finally 中完成,那么在 JDialog 中执行代码是否安全?
这里有一个例子来说明我在问什么:
import java.awt.EventQueue;
import javax.swing.JDialog;
public class DisposeTestDialog extends JDialog {
private final String somethingToPrint;
public DisposeTestDialog(String somethingToPrint) {
this.somethingToPrint = somethingToPrint;
}
public void showAndDispose() {
setVisible(true);
// Do something
setVisible(false);
try {
dispose();
}
finally {
System.out.println(somethingToPrint);
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
DisposeTestDialog dialog = new DisposeTestDialog("Can this be safely printed?");
dialog.showAndDispose();
}
});
}
}
根据我对dispose() 进程和finally 块的了解,我认为它应该可以正常工作,即使不是一个好主意。确实运行上述代码确实成功打印。
是否有可能在 try/finally 之间启动 GC 并导致一些问题?
【问题讨论】:
-
如果您需要让您的类持久化,请不要扩展 JDialog。使用 JDialog。仅当您想要覆盖组件方法之一时才扩展 Swing 组件。
-
@GilbertLeBlanc 是的,这实际上仅适用于此示例。我的实际用例大不相同。
标签: java swing dispose jdialog try-finally