SwingUtilities.invokeLater()
在我的方法doWork()中,我调用 然后我打电话SwingUtilities.invokeLater(),swing,button,colors,Swing,Button,Colors,在我的方法doWork()中,我调用 然后我打电话 SwingUtilities.invokeLater(new Runnable(){ public void run() { button.setBackgroundColor(Color.blue); } }); 问题是will be按钮是先红后蓝,还是先蓝后红?据我所知,它应该是红色然后蓝色,因为第一个事件首先被添加到事件队列中(嗯..)。invokeLater()将其参数添加到Swing事件队列中。因此,它们将按添加顺序执行,即先是红色
SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.blue);
}
});
问题是will be按钮是先红后蓝,还是先蓝后红?据我所知,它应该是
红色
然后蓝色
,因为第一个事件首先被添加到事件队列中(嗯..)。invokeLater()
将其参数添加到Swing事件队列中。因此,它们将按添加顺序执行,即先是红色,然后是蓝色。实际上,按钮本身的重新绘制可能有问题
IIRC,setBackground()
只会更改背景字段并触发重新绘制事件(通过调用repaint()
)。但即使在EDT中调用,实际的重新绘制也不会立即进行。相反,它将发送一个绘制事件,该事件将在稍后处理(并可能与其他绘制事件聚合)
因此,如果在对invokeLater()
的两次调用之间,代码中没有“任何内容”,那么您可能只看到最后一个颜色集,即蓝色,而根本看不到红色背景,但这在很大程度上取决于中间的代码
例如,如果您将
sleep()
放在两者之间,那么您可能会看到这两种颜色,首先是红色,然后是蓝色,例如:@assylias:API文档说调用实际上是由java.awt.EventQueue
处理的,其API文档明确表示事件已调度“按顺序。javadoc还说:“注意,可以合并发布到EventQueue的事件“-我有点困惑。@assylias:合并是一种特殊的机制,它只与鼠标移动事件、绘制事件以及源组件明确支持它的事件相关。请参见java.awt.Component#coalesceEvents()
SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.blue);
}
});