7

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

我有一个 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...

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

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
    }
});

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

4

4 回答 4

8

引用自Javadocs

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

因此,您的回复将被保留。所做的只是释放本dispose()机屏幕资源,其他成员没有被标记为垃圾回收。

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

于 2013-08-20T08:43:47.987 回答
3

如果我使用 dispose() 关闭对话框,则所有对话框的资源都可以被垃圾收集(不必......很难预测,对吗?)。那么以这种方式检索我的对话框的响应是否正确......也许在这种情况下我应该只写 setVisible(false); 没有处置()。

于 2013-08-20T08:46:13.967 回答
-1

为什么不使用类变量(私有静态或公共静态)并使用工厂方法

  //it can be an object too public static Object  getResponseValue()
  public static Integer  getResponseValue(){
    myclassContainer container = new myclassContainer(someparent,modal).setvisible(true)
     return      Myfieldvalue
    }

    private static int Myfielvalue;

}
于 2014-03-03T01:58:33.007 回答
-1
        dialog.add(BorderLayout.CENTER, tree_tmp);
        JButton confirm = new JButton("YES");
        confirm.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                confirm.setActionCommand("kkk");
                dialog.setVisible(false);
            }
        });
        dialog.add(BorderLayout.SOUTH,confirm);
        dialog.setSize(400, 400);
        dialog.setVisible(true);

        System.out.println(confirm.getActionCommand());
于 2016-02-03T21:46:48.860 回答