通过构造函数的 JOptionPane 不显示/提示

Posted

技术标签:

【中文标题】通过构造函数的 JOptionPane 不显示/提示【英文标题】:JOptionPane via constructor not showing/prompting 【发布时间】:2014-07-26 11:30:38 【问题描述】:

我正在编写一个脚本,它将调用一堆其他脚本,并在必要时传递适当的参数。由于调用了多个脚本,因此可能出现多个故障点。如果脚本在流程中途失败,则会记录下来,并在程序下一次启动时提示用户从该位置恢复。

服务器和用户都可以启动程序。一个是自主的,一个不是。在自治的情况下,我希望提示恢复有 10 秒的超时时间,因此如果没有收到任何输入,脚本将从头开始。

我已从静态 showOptionDialog 移至 JOptionPane 构造的对话框,因此我可以通过编程方式访问它以在 10 秒后将其终止。 我的问题是构造函数,不会出现提示。

我尝试过的:

我已通过调试验证代码正在进入代码块 Log() 脚本如下。 如您所见,我已尝试添加 JFrame 构造函数。 JFrame 构造函数、.add() 和 frame.SetVisible(true) 是没有提示的新增内容 也是。 我也注释掉了10秒 dialog.setVisible(false) 以防万一它被调用 过早地。

我确定我遗漏了一些明显的东西,但我看不到它。

    if(foundErroredScript != null)
        
            Log("debug - Found errored script, \"" + foundErroredScript + "\"");

            //Resume prompt
            Object[] options = "Yes, resume", "No, start over";               
            JFrame frame = new JFrame();
            JOptionPane pane = new JOptionPane("Would you like to resume from \"" + foundErroredScript + "\", AKA the last run script which errored?",
                    JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE,
                    null,
                    options);
            frame.add(pane);
            final JDialog dialog = pane.createDialog("Found last errored module");
            Timer timer = new Timer(10000, new ActionListener()
            
                public void actionPerformed(ActionEvent e)
                
                    //dialog.setVisible(false);
                
            );
            timer.setRepeats(false);
            timer.start();

            frame.setVisible(true);
            dialog.setVisible(true);


            Log("User selected " + pane.getValue());

【问题讨论】:

类似形式的代码可以正常工作,调试或发布 SSCCE/MCVE 简短、可运行、可编译的演示词 直到 JOptionPane 可见,什么都不会发生,模式对话框阻止(全部)重绘到已经可见的 GUI 【参考方案1】:

我想通了。

在遵循 mKorbel 的简化和隔离建议后,我将 JOptionPane 移到了它自己的简单类中。我不小心翻转了 MessageType 和 OptionType。该程序在隔离时抛出异常,但在主程序内部运行时不会。发生这种情况是因为从类构造函数分支出来的主程序逻辑最初是从引发 IOException 的 Main 方法调用的。

所以不是这个,

    JOptionPane pane = new JOptionPane("Would you like to resume from \"here\", AKA the last run script which errored?",
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE,
            null,
            options);

应该是这个,

    JOptionPane pane = new JOptionPane("Would you like to resume from \"here\", AKA the last run script which errored?",
            JOptionPane.QUESTION_MESSAGE,
            JOptionPane.YES_NO_OPTION,
            null,
            options);

愚蠢的错误。

编辑:我还删除了框架,因为它对于主要无 GUI 的应用程序来说是不必要的。

【讨论】:

另见Using Headless Mode in the Java SE Platform

以上是关于通过构造函数的 JOptionPane 不显示/提示的主要内容,如果未能解决你的问题,请参考以下文章

没有按钮的 JOptionPane

Java消息提示框JOptionPane()的使用方法

如何在所有窗口的顶部显示 JOptionPane

如何处理 JOptionPane 中的取消按钮

Java 构造函数的默认访问修饰符

如何使 JOptionPane 对话框在任务栏上显示为任务?