为什么一个组件的绘画延迟了?

时间:2013-01-30 12:22:07

标签: java multithreading swing awt event-dispatch-thread

我想将面板涂成蓝色,然后等待五秒钟,然后再做其他事情 现在我有以下代码,我希望能够做到我想要的。这是:

JPanel somePanel = getSomePanel();
somePanel.setBackground(Color.BLUE);
Object lock = new Object();
synchronized (lock) {
    try {
        lock.wait(5000);
    }
    catch (InterruptedException exc) { }
}
// Do other stuff

但相反,它会等待五秒钟,然后将组件涂成蓝色。

  • 为什么先等待,然后画蓝色,而不是反过来? (我想它与Swing机制有关......?)
  • 如何“改变订单”?

3 个答案:

答案 0 :(得分:4)

不要在GUI事件处理程序中等待 - 它会阻止消息的处理,例如。重绘请求。

等待锁定时没有GUI完成。

答案 1 :(得分:4)

不要在Swing事件线程上锁定同步代码,因为您所做的就是锁定Swing本身并冻结GUI。谷歌“Swin中的并发”的详细信息。我自己会为此使用Swing Timer。请注意,您的帖子使用的是标记,但实际上并没有在任何地方进行多线程处理。

答案 2 :(得分:3)

其他人是正确的,如果你在等待事件派遣线程,那么这个线程在此期间不会做任何绘画。

然而,有一个技巧可以帮助你而不需要开始一个新线程:在设置背景颜色后调用paintImmediately

somePanel.paintImmediately(0, 0, somePanel.getWidth(), somePanel.getHeight());