在swing中使用sleep()

mxg2im7a  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(420)
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");
   }
}

我要看节目 JButton("test2") 2秒后。
然后我加上 thread.sleep(2000) 之后 test1 .
但我不知道为什么节目会停止播放 test1 JButton ,未显示 test2 JButton 并且“show test”消息可以成功打印出来

pcww981p

pcww981p1#

简单的回答,不要。
swing是一个单线程框架,这意味着任何阻止事件调度线程的事情都会阻止它更新ui或处理任何新事件(使ui看起来像是挂起的,因为它已经挂起了)。
当然,你需要一个 Thread ,但swing也不是线程安全的。这意味着对ui的所有修改都必须在事件调度线程的上下文中进行。虽然有一些方法可以克服这个问题,但最简单的方法就是简单地使用swing Timer .
更详细地了解如何在swing中使用swing计时器和并发性
您还应该查看初始线程。
更新ui时,可能需要调用 revaldiate 以及 repaint 添加新组件以强制ui更新以重新布局其内容之后。

相关问题