【问题标题】:Closing A JOptionPane Programmatically以编程方式关闭 JOptionPane
【发布时间】:2013-08-08 23:02:38
【问题描述】:

我正在从事一个项目,我想以编程方式关闭通用 JOptionPane(通过不物理单击任何按钮)。当计时器到期时,我想关闭任何可能打开的 JOptionPane 并将用户踢回我的程序的登录屏幕。我可以很好地将用户踢回来,但 JOptionPane 仍然存在,除非我实际单击它上面的按钮。

我看过很多网站都没有这样的运气。在 JOptionPane 的“Red X”上调用 doClick() 方法似乎是不可能的,并且使用 JOptionpane.getRootFrame().dispose() 不起作用。

【问题讨论】:

  • 这是您要找的吗? stackoverflow.com/questions/7787499/…
  • 通常(虽然不一定),一个选项窗格显示在模态 JDialog 中,因此最多打开一个选项窗格。
  • @GGrec - 该响应在正确的轨道上,但我发现循环通过窗口,正如 kleopatra 建议的那样,在我的情况下工作得更好。谢谢!

标签: java swing joptionpane


【解决方案1】:

从技术上讲,您可以遍历应用程序的所有窗口,检查它们是否属于 JDialog 类型并有一个 JOptionPane 类型的子项,如果是,则处理该对话框:

Action showOptionPane = new AbstractAction("show me pane!") {

    @Override
    public void actionPerformed(ActionEvent e) {
        createCloseTimer(3).start();
        JOptionPane.showMessageDialog((Component) e.getSource(), "nothing to do!");
    }

    private Timer createCloseTimer(int seconds) {
        ActionListener close = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Window[] windows = Window.getWindows();
                for (Window window : windows) {
                    if (window instanceof JDialog) {
                        JDialog dialog = (JDialog) window;
                        if (dialog.getContentPane().getComponentCount() == 1
                            && dialog.getContentPane().getComponent(0) instanceof JOptionPane){
                            dialog.dispose();
                        }
                    }
                }

            }

        };
        Timer t = new Timer(seconds * 1000, close);
        t.setRepeats(false);
        return t;
    }
};

【讨论】:

  • 实现目标的非常有趣的方法 :-) 看起来比我自己的方法更有希望 :-)
  • 你的也是正确的(在有机会投票之前就分心了 :-) 在所有现实世界的上下文中,我希望 some 跟踪哪个计时器属于哪个选项窗格
  • 我将我的方法与您的方法相匹配,然后我发现,我忘记在任何地方关闭计时器一切都按照:-)
  • 请问为什么if (window instanceof JDialog) {不是直接instanceof JOptionPane,因为理论上在当前时间只能看到一个JOptionPane,如果通过则必须创建一个新循环,并在其中重复循环,第二次
  • @mKorbel ?? - 不明白您在说什么:JOptionPane 不是顶级容器,因此针对 JOptionPane 对顶级容器数组中的项目进行类型检查是没有意义的。为什么我要再次循环?我只是通过所有并关闭所有
【解决方案2】:

此代码来自 https://amp.reddit.com/r/javahelp/comments/36dv3t/how_to_close_this_joptionpane_using_code/ 对我来说似乎是最好的方法。它涉及实例化 JOptionPane 类,而不是使用静态辅助方法来为您完成。好处是你有一个 JOptionPane 对象,当你想关闭对话框时可以释放它。

JOptionPane jop = new JOptionPane();
jop.setMessageType(JOptionPane.PLAIN_MESSAGE);
jop.setMessage("Hello World");
JDialog dialog = jop.createDialog(null, "Message");

// Set a 2 second timer
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
        } catch (Exception e) {
        }
        dialog.dispose();
    }

}).start();

dialog.setVisible(true);

【讨论】:

    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多