Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法将JOptionPane设置为不可见,然后重新设置为可见_Java_Swing_Concurrency_Joptionpane_Event Dispatch Thread - Fatal编程技术网

Java 无法将JOptionPane设置为不可见,然后重新设置为可见

Java 无法将JOptionPane设置为不可见,然后重新设置为可见,java,swing,concurrency,joptionpane,event-dispatch-thread,Java,Swing,Concurrency,Joptionpane,Event Dispatch Thread,我想要达到的是 在特定状态下,类应该自动隐藏其他类显示的对话框 当程序状态改变时,应显示隐藏对话框 问题: 这不适用于JOptionPanes JOptionPanes会隐藏并再次显示,但随后会自动关闭,因此我只会在一秒钟内再次看到它们 我采用了以下方法: public static void main(String[] args) { Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener()

我想要达到的是

  • 在特定状态下,类应该自动隐藏其他类显示的对话框
  • 当程序状态改变时,应显示隐藏对话框
问题:

  • 这不适用于JOptionPanes
  • JOptionPanes会隐藏并再次显示,但随后会自动关闭,因此我只会在一秒钟内再次看到它们
我采用了以下方法:

public static void main(String[] args) {


    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

        public void eventDispatched(AWTEvent event) {
            WindowEvent windowEvent = ((WindowEvent) event);
            System.out.println(System.currentTimeMillis() + " " + windowEvent);
            switch (windowEvent.getID()) {
            case WindowEvent.WINDOW_OPENED:
                System.out.println("Hiding");
                windowEvent.getComponent().setVisible(false);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Showing");
                windowEvent.getComponent().setVisible(true);
                break;
            }
        }


    }, AWTEvent.WINDOW_EVENT_MASK + AWTEvent.WINDOW_STATE_EVENT_MASK);

    JOptionPane.showMessageDialog(null,
            "Eggs are not supposed to be green.",
            "Inane custom dialog",
            JOptionPane.INFORMATION_MESSAGE);
}
它产生以下输出:

1347602481337 java.awt.event.WindowEvent[WINDOW_ACTIVATED,opposite=null,oldState=0,newState=0] 
on dialog0
1347602481337 java.awt.event.WindowEvent[WINDOW_GAINED_FOCUS,opposite=null,oldState=0,newState=0] on dialog0
1347602481337 java.awt.event.WindowEvent[WINDOW_OPENED,opposite=null,oldState=0,newState=0] on dialog0
Hiding
Showing
1347602486377 java.awt.event.WindowEvent[WINDOW_LOST_FOCUS,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_DEACTIVATED,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_ACTIVATED,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_GAINED_FOCUS,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_LOST_FOCUS,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_DEACTIVATED,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_CLOSED,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_CLOSED,opposite=null,oldState=0,newState=0] on dialog0
1347602486377 java.awt.event.WindowEvent[WINDOW_CLOSED,opposite=null,oldState=0,newState=0] on frame0

我的问题是,我做错了什么?这是每个设计还是我犯了错误,我使用类的方式是否错误?如果是,正确的方法是什么?

您所做的错误是在事件调度线程上休眠:

windowEvent.getComponent().setVisible(false);
try {
  Thread.sleep(5000);
} catch (InterruptedException e) {
  e.printStackTrace();
}
System.out.println("Showing");
windowEvent.getComponent().setVisible(true);
通过阻断EDT 5秒钟,无法重新绘制任何内容。改用
计时器


有关详细信息,请参阅本教程。

我在睡眠周围添加了“EventQueue.invokeLater(new Runnable()…”,对话框的设置再次可见。现在它可以工作了。谢谢。@Flo然后您仍然在EDT上睡眠,这会阻止所有UI操作。从不在EDT上睡眠。我将程序更改为使用Timer.schedule(TimerTask任务,长延迟)相反。因此,这种方法不会阻塞EDT队列,应该在这种情况下使用。我理解正确吗?@Flo我建议使用
javax.swing.Timer
,因为这个
Timer
将在EDT上执行。因此,如果您想在5秒内安排EDT上发生的事情,您确实使用了
定时器,而不是ode>线程睡眠