SwingUtilities.invokeLater()

时间:2011-05-15 12:07:16

标签: swing button colors

在我的方法doWork()中,我调用

SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.red);
}
});
然后我打电话给

SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.blue);
}
});

问题按钮是红色然后是蓝色,还是蓝色然后是红色?

3 个答案:

答案 0 :(得分:11)

invokeLater()将其参数添加到Swing事件队列。因此它们将按照添加的顺序执行,即先红色然后蓝色。

答案 1 :(得分:0)

据我了解docs,它应该是red然后是blue,因为第一个事件首先被添加到事件队列(井..)。

答案 2 :(得分:0)

实际上,您可能在重新绘制按钮时遇到问题。

IIRC,setBackground()只会更改背景字段并触发重绘事件(通过调用repaint())。但即使在美国东部时间召集,实际重绘也不会立即发生。相反,它将发送一个绘画事件,稍后将处理(并可能与其他绘画事件聚合)。

因此,如果在invokeLater()的两个调用之间代码中没有“任何内容”,那么您可能只会看到最后一个颜色集,即蓝色,并且永远不会看到红色背景完全取决于中间的代码。

例如,如果您在其间放置sleep(),那么您可能会看到两种颜色,首先是红色,然后是蓝色