【发布时间】:2023-03-10 14:46:01
【问题描述】:
我想将面板涂成蓝色,然后等待 5 秒钟,然后执行其他操作。
现在我有了以下代码,我希望它可以做我想做的事。这里是:
JPanel somePanel = getSomePanel();
somePanel.setBackground(Color.BLUE);
Object lock = new Object();
synchronized (lock) {
try {
lock.wait(5000);
}
catch (InterruptedException exc) { }
}
// Do other stuff
但是,它会等待五秒钟,然后将组件涂成蓝色。
- 为什么要先等待,然后画蓝色,而不是反过来? (我猜这与 Swing 机制有关...?)
- 如何“更改订单”?
【问题讨论】:
-
不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用
Thread.sleep(n)实现 SwingTimer用于重复任务或SwingWorker用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing。 -
@AndrewThompson 但这对我来说很好,不使用
invokeLater()或invokeAndWait()这种行为也取决于不同的平台? -
“取决于不同的平台?” 平台、JRE、时间、湿度.. 不在 EDT 上进行 GUI 编辑会导致“不可预测”的行为。当然,阻塞EDT的结果是非常可预测的。
-
@AndrewThompson:别忘了 Look & Feel。我记得这个,因为我以前被它烧过!
标签: java multithreading swing awt event-dispatch-thread