我正在 Swing gui 中使用处理PApplet (http://processing.org/)编写一个应用程序,这两个并不是一个幸福的婚姻。我有一个 JButton 的监听器,它启动一个 Swing Worker 来运行一些长计算,然后绘制结果。问题是只有计算在 Swing Worker 中运行而不是负责绘图的Processing 动画线程,结果gui看起来像是空闲(进度条和 Jbutton generateProcessing 并不忙碌),而实际上它仍在密集一段时间。
在分析应用程序时,我可以看到运行计算的 Swing Worker 线程,然后它就会消失并执行 done()方法并输出“Finished”消息给终端,然后动画线程立即开始(在情节准备好之后它不会关闭但是进入睡眠状态,但我觉得这很好)。
当动画线程和 Swing Worker 作业完成时,预期的行为是调用 done()方法。< / p>
我的监听器看起来像这样( timeSlicerToProcessing 是一个扩展 PApplet 的类)
private class ListenGenerateProcessing implements ActionListener {
public void actionPerformed(ActionEvent e) {
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
// Executed in background thread
public Void doInBackground() {
generateProcessing.setEnabled(false);
progressBar.setIndeterminate(true);
//omitted
timeSlicerToProcessing.setBurnIn(Integer
.valueOf(burnInParser.getText()));
timeSlicerToProcessing.Impute(); //lengthy computations
timeSlicerToProcessing.init();
return null;
}// END: doInBackground()
// Executed in event dispatch thread
public void done() {
System.out.println("Finished. \n");
generateProcessing.setEnabled(true);
progressBar.setIndeterminate(false);
}// END: done
};
worker.execute();
}
}// END: ListenGenerateProcessing
修改
处理它是否在draw()方法中绘图,你不直接调用它,我知道在init()上调用setup()和draw()
这基本上是这样的:
public class MyProcessingSketch extends PApplet {
public void setup () {
size( 200, 200 );
background(100);
}
public void draw () {
drawStuff();
}
}
答案 0 :(得分:2)
我看到的一个问题是这段代码:
generateProcessing.setEnabled(false);
progressBar.setIndeterminate(true);
在声明并启动SwingWorker 之前,应该在actionPerformed方法中调用,因为需要在EDT上调用它。但是,您的代码段并未向我们显示动画的完成位置,因此很难说它还有什么问题。
修改强>
基于你的最新评论(我已经添加到你的原帖)我仍然不确定是什么问题,主要是由于我对pApplets如何工作的无知,但我不知道是否应该在EDT上调用init方法,也许是在SwingWorker的done方法中。