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