【发布时间】:2016-01-25 13:40:25
【问题描述】:
我昨天在What should I do in order to prevent the UI from freezing(scheduledexecutorservice) 发布了一个关于在使用 scheduleexecutorservice 时防止 UI 冻结的问题,大多数人建议使用 SwingWorker 而不是 scheduleexecutorservice。但是,从那时起,我一直在试图弄清楚 SwingWorker 线程在我的情况下如何工作。
我有以下伪代码:
createGraph(){
if(rule1)
n = new Node()
graph.add(n)
animateGraph()
createGraph()
if(rule2)
...
我有一个递归算法,它根据某些规则创建图形,我想在匹配规则并将新的顶点/边添加到图形时更新 UI。我的问题是如何在添加新节点/边时显示图形?这应该发生在 animateGraph() 方法中,当它遇到这个方法时,它应该更新实际的 UI,最好等待 1500 毫秒并这样做,直到整个图形构建完成。
我尝试创建一个 SwingWorker 线程。在这种情况下,它不显示图创建的中间步骤,而只显示最终图。首先,它执行对 doInBackground() 的所有调用,然后转到 done()。
注意:每次创建新的顶点/边时,我都会创建一个新的 SwingWorker 线程,因为我读到 doInBackground() 只被调用一次。
private void animateGraph() {
swingWorker = createRunnable();
swingWorker.execute();
}
private void displayGraph() {
JPanel.add(graph);
}
private SwingWorker<Object, Object> createRunnable() {
swingWorker = new SwingWorker<Object, Object>() {
@Override
protected Void doInBackground() throws Exception {
System.out.println("Start sleeping.. " + new Date());
Thread.sleep(1500);
publish(new NodeTuple(new Node("A"), new Node("B")));
return null;
}
protected void process(List<NodeTuple> chunks) {
System.out.println("In process.. " + new Date());
NodeTuple nodeTuple = chunks.get(chunks.size() - 1);
graph.addVertex(nodeTuple.source);
graph.addVertex(nodeTuple.target);
checkIfToAddEdge(nodeTuple.source, nodeTuple.target);
createDiagram();
}
}
};
return swingWorker;
}
编辑:我更新了 doInBackground() 和 process() 方法。但是,我仍然没有得到我真正想要的东西。不显示中间步骤,只显示最终图表。
【问题讨论】:
标签: java swing concurrency swingworker