将AnimationThread作为Swing中的后台任务处理

时间:2011-06-28 08:44:46

标签: java swing processing

我正在 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(); 
  } 
}

1 个答案:

答案 0 :(得分:2)

我看到的一个问题是这段代码:

generateProcessing.setEnabled(false);
progressBar.setIndeterminate(true);
在声明并启动SwingWorker 之前,应该在actionPerformed方法中调用

,因为需要在EDT上调用它。但是,您的代码段并未向我们显示动画的完成位置,因此很难说它还有什么问题。

修改
基于你的最新评论(我已经添加到你的原帖)我仍然不确定是什么问题,主要是由于我对pApplets如何工作的无知,但我不知道是否应该在EDT上调用init方法,也许是在SwingWorker的done方法中。