首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwingUtilities.invokeLater()

SwingUtilities.invokeLater()
EN

Stack Overflow用户
提问于 2011-05-15 20:07:16
回答 3查看 1.7K关注 0票数 4

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

代码语言:javascript
复制
SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.red);
}
});

然后我会打电话给

代码语言:javascript
复制
SwingUtilities.invokeLater(new Runnable(){
public void run() {
button.setBackgroundColor(Color.blue);
}
});

问题是按钮是先红后蓝,还是先蓝后红?

EN

回答 3

Stack Overflow用户

发布于 2011-05-15 20:13:58

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

票数 11
EN

Stack Overflow用户

发布于 2011-05-15 20:12:36

就我对docs的理解而言,它应该是red,然后是blue,因为第一个事件被添加到事件队列中(好吧..)第一。

票数 0
EN

Stack Overflow用户

发布于 2011-05-15 23:32:53

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

IIRC,setBackground()只会更改背景字段并触发一个重新绘制事件(通过调用repaint())。但实际的重绘不会立即发生,即使在EDT中调用也是如此。相反,它将发送一个绘制事件,该事件将在稍后处理(并可能与其他绘制事件聚合)。

因此,如果在两次调用invokeLater()之间的代码中“什么都没有”,那么您可能只看到最后一个颜色集,即蓝色,而根本看不到红色背景,但这在很大程度上取决于中间的代码。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6008279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档