在我的方法doWork()中,我调用
SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.red);
}
});然后我会打电话给
SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.blue);
}
});问题是按钮是先红后蓝,还是先蓝后红?
发布于 2011-05-15 20:13:58
invokeLater()将其参数添加到Swing事件队列中。因此,它们将按照添加的顺序执行,即先是红色,然后是蓝色。
发布于 2011-05-15 20:12:36
就我对docs的理解而言,它应该是red,然后是blue,因为第一个事件被添加到事件队列中(好吧..)第一。
发布于 2011-05-15 23:32:53
实际上,您可能会在重新绘制按钮本身时遇到问题。
IIRC,setBackground()只会更改背景字段并触发一个重新绘制事件(通过调用repaint())。但实际的重绘不会立即发生,即使在EDT中调用也是如此。相反,它将发送一个绘制事件,该事件将在稍后处理(并可能与其他绘制事件聚合)。
因此,如果在两次调用invokeLater()之间的代码中“什么都没有”,那么您可能只看到最后一个颜色集,即蓝色,而根本看不到红色背景,但这在很大程度上取决于中间的代码。
例如,如果您在两者之间放置了一个sleep(),那么您可能会看到两种颜色,首先是红色,然后是蓝色。
https://stackoverflow.com/questions/6008279
复制相似问题