java - 在 Thread.sleep() 之前创建的 JDialog 在 sleep 完成后显示

标签 java swing

我刚刚在尝试向 swing 应用程序添加印记时遇到问题,该印记在应用程序关闭时会显示五秒钟。

我计划在主框架关闭时打开一个仅包含简单图像的 JDialog。

我得到了一个显示 JDialog 的函数(我删除了所有不需要的内容)。

public static void show() { 

    JDialog d = new JDialog();  
    JLabel l = new JLabel(new ImageIcon(MainController.class.getClass().getResource("/path/to/endlogo.png")));          
    d.add(l);       
    d.setVisible(true);

}

该函数由以下代码片段调用(在我的主窗口的窗口监听器中)

@Override
public void windowClosing(WindowEvent e) {

    show();

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }           

}

问题是该对话框在五秒后显示(即当窗口已经关闭并且应用程序退出时,我测试了它,并且在应用程序启动时运行时它在五秒后完美显示)。

你们知道一种相反的方法吗?

最佳答案

您正在阻塞 UI 线程。基本上不要这样做...如果您想稍后在 UI 线程上执行某些操作,请使用 Swing 计时器或类似的东西。

黄金法则:

  • 不要在 UI 线程上执行任何耗时的操作
  • 仅在 UI 线程上访问 UI

关于java - 在 Thread.sleep() 之前创建的 JDialog 在 sleep 完成后显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27278816/

相关文章:

java - Java中的自减运算

java - 如何在 libgdx 中创建轨道?

java - 从 javax.swing.text.Document 实例获取所有监听器

java - JLabel 的 setText() 方法无法正常工作

java - 支持多个 xsd 版本

java - 如何从SQS消息中获取 `ApproximateReceiveCount`

java - java.version 和 maven.compiler.target 的区别

java - 如何使用 key 监听器更新 "x"变量?

java - 如何使用 JTabbedPane 引用特定选项卡?

java - JTree 在更改节点名称时更改 lineStyle