从JDialog返回值; dispose(),setVisible(false) - 示例

gui*_*eak 7 java swing dispose jdialog

我知道,这个问题在这里经常出现在这里:但我想提出一些非常具体的例子......我只是不确定我是否做对了.

我有一个JDialog,我可以输入一些值,选择一些复选框......无论如何......我还有一些在MyDialog中创建的Response对象,代表MyDialog的"答案".

在调用/创建JDialog的JFrame中:

MyDialog d = new MyDialog(this, ...);
d.showDialog();
// After MyDialog is closed (it's modal):
MyDialog.Response dialogResponse = d.getDialogResponse();
// Do something with response...
Run Code Online (Sandbox Code Playgroud)

在对话框中(可以通过单击"保存"按钮关闭对话框):

btnSave.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        dialogResponse = prepareResponse(); // prepares response on the basis of some data introduced by a user; dialogResponse is called from JFrame after Dialog is closed
        setVisible(false);
        dispose();  // <-- Important
    }
});
Run Code Online (Sandbox Code Playgroud)

我的问题是:这个解决方案有效,我的意思是,该行MyDialog.Response dialogResponse = d.getDialogResponse();返回正确的值,但是......如果我使用dispose()关闭对话框,所有对话框的资源都可以被垃圾收集(不必...难以预测, 我对吗?).因此,以这种方式检索我的对话框的响应是正确的...也许在这种情况下我应该只写 setVisible(false);没有dispose().

Mar*_*ioP 7

引自Javadocs:

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

因此,您的回复将被保留.一切dispose()都是释放本机屏幕资源,其他成员没有标记为垃圾收集.

此外,如果您想要更加确定,可以dispose()在检索到响应对象后立即调用.