java - 在 Swing 中使用 sleep()

标签 java multithreading swing

public class TestFrame extends JFrame
{
   public TestFrame()
   {

        setBounds(10, 10, 500, 500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(3);       
   }

   public static void main(String[] args) throws InterruptedException
   {
        TestFrame tf = new TestFrame();
        tf.add(new JButton("test1"));
        tf.setVisible(true);
        Thread.sleep(2000);
        tf.getContentPane().removeAll();
        tf.add(new JButton("test2"));
        System.out.print("Show test");
   }
}

我希望程序在 2 秒后显示 JButton("test2")
然后我在 test1 之后添加 thread.sleep(2000)

但我不知道为什么程序在显示 test1 JButton 时停止, 不显示 test2 JButton 并且“show test”消息可以成功打印出来

最佳答案

简短的回答,不要。

Swing 是一个单线程框架,这意味着任何阻塞事件分派(dispatch)线程的事物都会阻止它更新 UI 或处理任何新事件(使您的 UI 看起来像是挂起的,因为它确实挂起了)。

当然,您可以使用Thread,但 Swing 也不是线程安全的。这意味着对 UI 的所有修改都必须在事件调度线程的上下文中进行。虽然有多种方法可以克服这个问题,但最简单的方法是简单地使用 Swing Timer

仔细看看How to use Swing TimersConcurrency in Swing了解更多详情

您还应该看看 Initial Threads .

更新 UI 时,添加新组件后可能需要调用 revaldiaterepaint 以强制 UI 更新以重新布局其内容.

关于java - 在 Swing 中使用 sleep(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26688100/

相关文章:

java - 记录 JButton 网格中最后按下的 JButton

java - java中数组,检查最小、最大和平均值

java - 盒子2D |禁用动态主体碰撞,同时仍在碰撞时触发 ContactListener

java - 将 Runtime#exec() 与 javac 一起使用 - 无类文件

C++11 线程错误运行时

java - Jlayer MP3播放器,在java中控制mp3文件的音量

java - zabbix服务器无法连接到java网关

java - 如何在不等待输出的情况下继续使用 CompletableFuture

java - 我如何将值从我的线程传递到第三方 api 线程,并从第三方线程将值更改为 Java 中的静态变量?

java - 使用 UIManager 的 TitledBorder 边框颜色和宽度