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

时间:2013-08-20 08:35:09

标签: java swing dispose jdialog

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

我有一个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 个答案:

答案 0 :(得分:7)

引自Javadocs

  

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

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

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

答案 1 :(得分:3)

  

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

答案 2 :(得分:-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;

}

答案 3 :(得分:-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());