程序化地关闭JOptionPane.ShowInternalOptionDialog

3
我的当前设计如下: 我有一个显示主应用程序的外框架。当用户点击主应用程序上的按钮时,应该启动一个弹出窗口。我正在使用JOptionPane.showInternalOptionDialog,并将按钮对象作为选项传递。当用户单击其中一个按钮时,它应该运行特定的命令,然后关闭窗口。我无法关闭显示弹出窗口的框架。
我在这个论坛中发现了一个类似的问题,建议采用以下解决方法。 Closing a dialog created by JOptionPane.showOptionDialog() 但是上述解决方法会关闭我的整个GUI。我只想关闭JOptionPane弹出窗口。
提前感谢。
4个回答

7

尝试

JOptionPane.getRootFrame().dispose();

在一个事件中

2

我曾经也遇到过同样的问题。我使用了一个线程,在X毫秒后关闭我的JOptionPane,从而解决了这个问题。

import javax.swing.JOptionPane;

    public class JOptionPaneExample {
        public static void main(String[] args) {
            final JOptionPane pane =new JOptionPane();
            Thread t1 = new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }               
                    pane.getRootFrame().dispose();
                }
            });
            t1.start();
            pane.showMessageDialog(null, "I will close after 3000 milli's", "Programmatic Auto-close JOptionPane", JOptionPane.INFORMATION_MESSAGE);
            System.exit(0);
        }
    }

2

有几个解决方案:

  1. 直接创建一个JOptionPane而不是使用showX()方法。这将允许您拥有对对话框的引用,以便您可以将其传递给按钮,以允许它调用dispose()方法。
  2. 创建自己的对话框而不是使用JOptionPane。这将是我的首选选项,因为您正在远离简单的对话框。

0

默认情况下,在 JOptionPane 中单击按钮将关闭对话框。如果没有关闭,那是因为您正在使用实际组件而不是字符串或其他对象,并且它调用了您的按钮自定义事件处理程序而不是其自己的事件处理程序。

建议您采用不同的方法,使用字符串而不是按钮。使用一个按钮数组作为输入值,当调用 showInternalOptionDialog 返回时,您可以检查 int 索引以找出按下了什么,然后在代码中切换。这样,您就不必触及 JOptionPane,它将自动关闭。


我选择JOptionPane的原因是我想要一个模态对话框。没错,我传递了字符串和JButton作为选项。我选择使用JButton对象作为选项的原因是,我不希望面板立即关闭。我希望所有的检查都完成后再关闭。在处理过程中,如果有任何错误,我希望面板保持打开状态。 - Jupiter
啊,谢谢你澄清这个问题。在这种情况下,我肯定推荐你为此制作一个自定义的 JDailog 。通常 JOptionPane 用于简单的问答场景。 - BoffinBrain
谢谢大家。看起来我应该采用JDialog的方式。 - Jupiter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接