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 Timers和Concurrency in Swing了解更多详情
您还应该看看 Initial Threads .
更新 UI 时,添加新组件后可能需要调用 revaldiate
和 repaint
以强制 UI 更新以重新布局其内容.
关于java - 在 Swing 中使用 sleep(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26688100/