【问题标题】:using sleep() in swing在摇摆中使用 sleep()
【发布时间】:2014-12-28 13:35:18
【问题描述】:
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 并且“显示测试”消息可以成功打印出来

【问题讨论】:

  • 这类问题在一周内会被问(并解决)好几次。您是否尝试过先寻找解决方案?

标签: java multithreading swing


【解决方案1】:

简短回答,不要。

Swing 是一个单线程框架,这意味着任何阻塞事件调度线程的东西都会阻止它更新 UI 或处理任何新事件(使您的 UI 看起来像是挂起的,因为它已经挂起)。

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

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

你也应该看看Initial Threads

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多