可能重复:
How do I wait for a SwingWorker's doInBackground() method?
我已经读过这样做非常糟糕的做法,但我认为这是实现目标的最好方式...... 有没有办法阻止主线程,直到swing工作者完成以下示例?
public void flashNode(Node node, int noOfFlashes) {
GraphUpdater updater = new GraphUpdater(node, noOfFlashes);
updater.execute();
}
和SwingWorker
类
public class GraphUpdater extends SwingWorker<Integer, Integer> {
Node node;
int noOfFlashes;
public GraphUpdater(Node n, int noFlashes) {
node = n;
noOfFlashes = noFlashes;
}
@Override
protected Integer doInBackground() throws Exception {
Color origColor = node.getColor();
for (int i=0; i<noOfFlashes; i++) {
changeNodeColor(node, Color.WHITE);
Thread.sleep(500);
changeNodeColor(node, origColor);
Thread.sleep(500);
}
return 1;
}
}
提前致谢
答案 0 :(得分:2)
正如我所提到的,在Swing EDT期间永远不要使用Thread#sleep(int)
,在Thread#sleep(int)
结束之前使用GUI简单冻结,在Concurency in Swing中更多地使用冻结here
你有三个(可能是四个)选项如何在某个时期更新GUI或者每次执行一些延迟
使用Runnable#Thread
将所有here(加java.util.Timer
一起放入invokeLater
包含的执行中
答案 1 :(得分:1)
如果你想阻止,那就不要使用摇摆工作者,只需做
changeNodeColor(node, Color.WHITE);
Thread.sleep(500);
changeNodeColor(node, origColor);
Thread.sleep(500);
在美国东部时间上。 SwingWorker的全部目的是不阻止EDT。
如果您只想以特定间隔更改组件的颜色(即闪烁组件),那么javax.swing.Timer
可能更合适。