【问题标题】:Processing AnimationThread as a background task in Swing在 Swing 中将 AnimationThread 处理为后台任务
【发布时间】:2011-09-24 03:15:19
【问题描述】:

我正在 Swing gui 中使用 Processing PApplet (http://processing.org/) 编写应用程序,这两者的婚姻并不幸福。我有一个 JButton 的监听器,它启动一个 Swing Worker 来运行一些长时间的计算,然后绘制结果。问题是只有计算在 Swing Worker 中运行,而不是在负责绘图的处理 Animation Thread 中运行,结果 gui 看起来像未被占用(进度条 em> 和 Jbutton generateProcessing 不忙),而实际上它仍在绘制一分钟左右。

在分析应用程序时,我可以看到 Swing Worker 线程正在运行计算,然后它消失了,done() 方法被执行并打印“Finished”消息到终端,然后 Animation Thread 立即启动(情节准备好后它不会关闭而是进入睡眠状态,但我猜这很好)。

预期的行为是在 Animation ThreadSwing Worker 作业都完成时调用 done() 方法。

我的监听器看起来像这样(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() 方法中绘制,你不直接调用它,据我所知 setup() 和 draw() 都在 init() 上调用

这基本上看起来像这样:

public class MyProcessingSketch extends PApplet { 
  public void setup () { 
    size( 200, 200 ); 
    background(100); 
  } 

  public void draw () { 
    drawStuff(); 
  } 
}

【问题讨论】:

    标签: java swing processing


    【解决方案1】:

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

    generateProcessing.setEnabled(false);
    progressBar.setIndeterminate(true);
    

    应该在声明和启动 SwingWorker 之前在 actionPerformed 方法中调用,因为它需要在 EDT 上调用。但是,您的代码 sn-p 并没有向我们显示动画的完成位置,因此很难说它还有什么问题。

    编辑:
    根据您最新的 cmets(我已添加到您的原始帖子中),我仍然不确定问题出在哪里,主要是由于我对 pApplets 的工作原理一无所知,但是我想知道是否应该在 EDT 上调用 init 方法,也许在 SwingWorker 的 done 方法中。

    【讨论】:

    • 处理它是否在 draw() 方法中绘制,你不会直接调用它,据我所知 setup() 和 draw() 都会在 init() 上调用。
    • @fbielejec:我在上面发布了您的评论,作为对您原始帖子的编辑,您应该这样做以便可以看到您的代码。
    • 非常感谢您的 cmets。我已经尝试了你的两个提示,不幸的是不是这样。即使我将调用移到 init 之前,我仍然可以看到“已完成”消息和空闲进度条。此外,在 done() 中调用 init 会在绘图时严重冻结 gui。如果有办法以某种方式从 SwingWorker 调用 Processing AnimationThread ...
    • 对不起,我帮不上忙。希望了解处理库的人会做出贡献。祝您的问题好运。
    • +1 抱歉,不是 Processing 那个人,但也请参阅这个 answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多