【问题标题】:Returning value from JDialog; dispose(), setVisible(false) - example从 JDialog 返回值; dispose(), setVisible(false) - 示例
【发布时间】:2013-08-22 05:38:47
【问题描述】:

我知道,这个问题经常出现在 SO 中,例如 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()

【问题讨论】:

  • 如果您以后需要JDialog,请不要丢弃它,只需使用setVisible(false),否则您可以毫无问题地丢弃它
  • 不确定我是否理解,因此发表了评论,但你不能从框架中处理对话框吗?
  • @npinti 是的,但我主要是好奇在对话框上调用 dispose() 后是否可以访问对话框的响应
  • 如果我正确地理解了您的问题,为什么不在您在对话框中填写值时创建一个名为 DialogResponse 的类,对您的 DialogResponse 类的对象和简单的 return 进行必要的更改这个对象到父JFrame,这样你真的不必担心JDialog被dispose,此外,如果再次使用相同的JDialog,你可以使用相同的类进行进一步更新得到回应。如果你的 JDialog 有大量的内容要与你的父类分享,请使用它。
  • 你能帮我stackoverflow.com/questions/31652594/…吗?我已经将 JFrame 更改为 JDialog。现在我有问题保存 JDialog 内容.. @guitar_freak

标签: java swing dispose jdialog


【解决方案1】:

引用自Javadocs

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • ???显然我在这里错过了一部分....来吧,类变量很好,它们是必要的,这就是我们拥有它们的原因,工厂方法常量,如 jdialogs 按钮,你应该阅读更多
      【解决方案4】:
              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());
      

      【讨论】:

        猜你喜欢
        • 2011-11-07
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 2013-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多