在我的方法doWork()中,我调用
SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.red);
}
});
然后我打电话给
SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.blue);
}
});
问题按钮是红色然后是蓝色,还是蓝色然后是红色?
答案 0 :(得分:11)
invokeLater()
将其参数添加到Swing事件队列。因此它们将按照添加的顺序执行,即先红色然后蓝色。
答案 1 :(得分:0)
据我了解docs,它应该是red
然后是blue
,因为第一个事件首先被添加到事件队列(井..)。
答案 2 :(得分:0)
实际上,您可能在重新绘制按钮时遇到问题。
IIRC,setBackground()
只会更改背景字段并触发重绘事件(通过调用repaint()
)。但即使在美国东部时间召集,实际重绘也不会立即发生。相反,它将发送一个绘画事件,稍后将处理(并可能与其他绘画事件聚合)。
因此,如果在invokeLater()
的两个调用之间代码中没有“任何内容”,那么您可能只会看到最后一个颜色集,即蓝色,并且永远不会看到红色背景完全取决于中间的代码。
例如,如果您在其间放置sleep()
,那么您可能会看到两种颜色,首先是红色,然后是蓝色。