Java 自动关闭Jdialog而无需用户操作

Java 自动关闭Jdialog而无需用户操作,java,swing,timer,jdialog,Java,Swing,Timer,Jdialog,我正在创建一个应用程序,在其中测试一定数量的接口功能,当出现错误时,我希望显示一条错误消息。 然后应用程序应该截取整个屏幕的屏幕截图,最后错误消息在没有用户帮助的情况下关闭 为此,我尝试使用JDialog,如下所示: JOptionPane pane = new JOptionPane("Error message", JOptionPane.INFORMATION_MESSAGE); JDialog dialog = pane.createDialog("Error");

我正在创建一个应用程序,在其中测试一定数量的接口功能,当出现错误时,我希望显示一条错误消息。
然后应用程序应该截取整个屏幕的屏幕截图,最后错误消息在没有用户帮助的情况下关闭

为此,我尝试使用JDialog,如下所示:

    JOptionPane pane = new JOptionPane("Error message", JOptionPane.INFORMATION_MESSAGE);
    JDialog dialog = pane.createDialog("Error");
    dialog.addWindowListener(null);
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    dialog.setVisible(true);
    Application.takeScreenshot();
    dialog.setVisible(false);
我想知道是否有一个具体的方法来关闭它。我查阅了文档,似乎找不到它。我试图找到一个相关的问题,但没有找到一个解决我的问题

我想知道是否有办法获取窗口句柄,然后使用该句柄将其关闭,或者简单地向窗口发送“close”或“Press_ok”事件

编辑:在我看来,当messagebox显示时,代码似乎完全停止运行,就好像有一个线程。sleep(),直到用户手动关闭窗口

如果可能的话,代码示例会很有帮助


谢谢

尝试使用
ScheduledExecutorService
。比如:

    JDialog dialog = pane.createDialog("Error");
    dialog.addWindowListener(null);
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

ScheduledExecutorService sch = Executors.newSingleThreadScheduledExecutor();     
sch.schedule(new Runnable() {
    public void run() {
        dialog.setVisible(false);
        dialog.dispose();
    }
}, 10, TimeUnit.SECONDS);

dialog.setVisible(true); 
[编辑]

关于camickr注释,文档没有提到在事件调度线程上执行
ScheduledExedcutorService
。所以最好使用
swing.Timer

JDialog dialog = pane.createDialog("Error");
 dialog.addWindowListener(null);
 dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

Timer timer = new Timer(10000, new ActionListener() { // 10 sec
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(false);
                dialog.dispose();
            }
        });

        timer.start();

        dialog.setVisible(true); 

我设法把它修好了。默认情况下,JDialog是模态的,这意味着它会中断其他所有操作,直到用户关闭它为止。为了解决这个问题,我使用了以下方法:

dialog.setModalityType(Dialog.ModalityType.MODELESS);
当此选项处于活动状态时,一个简单的.setVisible(false);够了。
无论如何,谢谢你的帮助,很抱歉提出了一个不必要的问题,但我已经问了好几个小时,直到找到为止。希望它能帮助其他人。

在Java7中可能会有副作用,延迟更长,然后是dialog。无论出于什么好的提示,我从来没有用过超过20秒的时间,有doc。参考?所有Swing更新都应在EDT上执行。文档中没有提到在EDT上执行ScheduledExedcutorService。因此,您应该使用一个
摆动计时器
。请看一看这个奇妙的,它确实以更好的方式完成了它的工作:-)将
JDialog设置为false是不够的,因为它仍然会保留。把它处理掉是一个好办法。此外,我在上面提供的链接中引用的示例与
JDialog
是否为模态无关。