Java JOptionpane+;JDialog(非模态)获取返回值

Java JOptionpane+;JDialog(非模态)获取返回值,java,swing,joptionpane,jdialog,non-modal,Java,Swing,Joptionpane,Jdialog,Non Modal,我有一个非模式对话框,其中有两个输入文本字段,显示在带有OK和CANCEL按钮的JOptionPane中。我显示如下对话框 JTextField field_1 = new JTextField("Field 1"); JTextField field_2 = new JTextField("Field 2"); Object[] inputField = new Object[] { "Input 1", field_1,

我有一个非模式对话框,其中有两个输入文本字段,显示在带有OK和CANCEL按钮的JOptionPane中。我显示如下对话框

        JTextField field_1 = new JTextField("Field 1");
        JTextField field_2 = new JTextField("Field 2");

        Object[] inputField = new Object[] { "Input 1", field_1,
                "Input_2", field_2 };

        JOptionPane optionPane = new JOptionPane(inputField,
                JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
        JDialog dialog = optionPane.createDialog(null, "Input Dialog");
        dialog.setModal(false);
        dialog.setVisible(true);

如何从对话框中获取返回值?意味着我需要知道是否按下了“确定”或“取消”按钮。如何实现这一点?

将告诉您对话框是如何关闭的。由于它是非模态的,所以一旦对话框关闭,您就需要获取该信息,可能需要使用
线程
,等待对话框关闭以返回信息。您没有提供任何关于什么需要这些信息的详细信息,因此使用另一个
线程可能不是您的最佳解决方案。

一种方法是将
组件侦听器添加到
对话框
,并监听其可见性的变化

dialog.addComponentListener(new ComponentListener() {
    @Override
    public void componentResized(ComponentEvent e) { }

    @Override
    public void componentMoved(ComponentEvent e) { }

    @Override
    public void componentShown(ComponentEvent e) { }

    @Override
    public void componentHidden(ComponentEvent e) {
        if ((int) optionPane.getValue()
                == JOptionPane.YES_OPTION) {
            // do YES stuff...
        } else if ((int) optionPane.getValue()
                == JOptionPane.CANCEL_OPTION) {
            // do CANCEL stuff...
        } else {
            throw new IllegalStateException(
                    "Unexpected Option");
        }
    }
});

注意:您可能应该使用
组件适配器
;我正在展示整个界面以供说明。

您可能想看一看。我尝试了这个方法,但在与JOptionPane交互时没有调用任何重写的方法。@MarkCramer我注意到我的答案有一个编译时错误,我已经修复了这个错误。但除此之外,我从问题和答案中提取了代码,它似乎按照预期工作。你是否可以提出一个问题,举例说明在哪些方面不适合你?