0

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

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

但相反,它会等待五秒钟,然后将组件绘制为蓝色。

  • 为什么先等待,然后画蓝色,而不是反过来呢?(我猜它与 Swing 机制有关......?)
  • 如何“更改该顺序”?
4

3 回答 3

4

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

当您等待锁定时,GUI 不会完成任何操作。

于 2013-01-30T12:27:46.360 回答
4

不要在 Swing 事件线程上锁定同步代码,因为您所做的只是锁定 Swing 本身并冻结 GUI。谷歌“Concurrency in Swing”了解详情。我自己我会为此使用Swing Timer。请注意,您的帖子使用标签,但您实际上并没有在任何地方进行多线程。

于 2013-01-30T12:28:30.123 回答
3

其他的都是对的,如果你在事件派发线程上等待,那么这个线程在此期间不会做任何绘画。

但是,有一个技巧可以帮助您,而无需启动新线程:在设置背景颜色后立即调用paintImmediately 。

somePanel.paintImmediately(0, 0, somePanel.getWidth(), somePanel.getHeight());
于 2013-01-30T12:47:45.747 回答