java - 无法将 JOptionPane 设置为不可见然后再次恢复可见

标签 java swing concurrency joptionpane event-dispatch-thread

我想实现的是

  • 在某种状态下,一个类应该自动隐藏其他类显示的对话框
  • 隐藏的对话框应该在程序状态改变时显示

问题:

  • 这不适用于 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

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

最佳答案

你做错的是在事件调度线程上 hibernate :

windowEvent.getComponent().setVisible(false);
try {
  Thread.sleep(5000);
} catch (InterruptedException e) {
  e.printStackTrace();
}
System.out.println("Showing");
windowEvent.getComponent().setVisible(true);

通过阻止 EDT 5 秒,无法重绘任何内容。请改用 Timer

参见 Concurrency in Swing教程以获取更多信息。

关于java - 无法将 JOptionPane 设置为不可见然后再次恢复可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12418961/

相关文章:

扫描 AWS S3 时,Python 线程池比 Go 例程更快?

java - 表单验证后的消息

java - 如何将一个简单的 GUI java 类转换为 applet?

c# - 如何在线程之间传递锁?

java - Java 中 Mac 上的 JTable 中的 JTooltip 在单击时不会选择该行

java - 如何在一个 JScrollPane 中显示多个可选择的图像?

concurrency - 并行流

java - 在单独的包中使用嵌套枚举作为参数

java - 嵌套集合字段的Spring Mongodb分页

Java - 创建对同一对象的两个引用