我有一个带有gui的简单JAVA程序,它只增加int变量,并在JLabel中显示它的值。我创建新线程用于正确(线程安全)更新JLabel,方法是使用Runnable类调用它内部的EventQueue.invokeLater(),运行方法就是这样做的。
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
label.setText("" + number);
}
});当我运行程序时,正如预期的那样,label的数量开始快速增长,从1增长到大约5000,但随后它开始放缓,我开始看到这样的标签更新,比如100255,173735,235678,以及它们之间的大停顿与阻塞的GUI。但是,当我不使用EventQueue.invokeLater()进行编译时,只要直接调用label.setText("" + number);,一切都工作得很好,而且我可以看到标签的每一个数字是如何变化得非常快的。但我当然意识到,在这种情况下,我的方法不是线程安全的。
有什么问题吗?在我看来,EventQueue的工作速度很慢什么的。
发布于 2013-09-25 19:09:28
可能,事件队列被阻塞了。当您正在排队事件时,您可能需要考虑合并这些事件以删除冗馀项,而不是将它们从队列中删除和激活。
每次将事件添加到队列中时,都会查询现有事件,以查看它们是否将新事件与自身合并。随着队列的备份,越来越多的事件必须被如此查询,并且系统越来越落后。这对于鼠标事件是有用的,但是在这样一个简单的(和人为的)情况下,它可能是有害的。
尽管如此,我仍然模糊地记得,GUI代码是经过优化的,以避免尝试合并不覆盖适当方法的事件,因此您的问题可能只是一个简单的待办事项。
与直接调用setText不同,您可以创建一个自定义事件来设置组件上的文本,为它实现合并并使用它,以便在任何给定的时间只有最近的文本被挂起。如果您这样做,并且希望根据先前设置的内容来设置文本,最好保留值,并始终从该值中设置GUI小部件,而不是使用getText来回忆GUI小部件的当前值。否则,合并要困难得多。
https://stackoverflow.com/questions/19013185
复制相似问题