Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwingUtilities.invokeLater()_Swing_Button_Colors - Fatal编程技术网

SwingUtilities.invokeLater()

SwingUtilities.invokeLater(),swing,button,colors,Swing,Button,Colors,在我的方法doWork()中,我调用 然后我打电话 SwingUtilities.invokeLater(new Runnable(){ public void run() { button.setBackgroundColor(Color.blue); } }); 问题是will be按钮是先红后蓝,还是先蓝后红?据我所知,它应该是红色然后蓝色,因为第一个事件首先被添加到事件队列中(嗯..)。invokeLater()将其参数添加到Swing事件队列中。因此,它们将按添加顺序执行,即先是红色

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

然后我打电话

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);
}
});