Обработка AnimationThread в качестве фоновой задачи в Swing - PullRequest
2 голосов
/ 28 июня 2011

Я пишу приложение, используя Processing PApplet (http://processing.org/) внутри Swing gui , и эти два не являются счастливым браком. У меня есть слушатель для JButton , который запускает Swing Worker , чтобы выполнить некоторые длинные вычисления и затем построить график результатов. Проблема в том, что только вычисления выполняются в Swing Worker , а не в Обрабатывающем Анимационном потоке , ответственном за построение графика, в результате графический интерфейс выглядит как незанятый ( индикатор выполнения и Jbutton generateProcessing * (1018 * не заняты), в то время как на самом деле он все еще готовит сюжет в течение доброй минуты или около того.

При профилировании приложения я вижу Swing Worker поток, выполняющий вычисления, затем он отключается, а методы done () выполняются и выводят сообщение "Finished" на терминал, тогда Animation Thread сразу же включается (после того, как сюжет готов, он не выключается, а уходит в сон, но это нормально, я думаю).

Ожидаемое поведение - вызов метода done () при выполнении заданий Animation Thread и Swing Worker .

Мой слушатель выглядит так ( 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

Edit:
Обработка выполняет построение графика в методе draw (). Вы не вызываете его напрямую, насколько я знаю, вызовы setup () и draw () вызываются при init ()

По сути это выглядит так:

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

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

1 Ответ

2 голосов
/ 28 июня 2011

Одна проблема, которую я вижу, состоит в том, что этот код:

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

должен вызываться в методе actionPerformed до , после чего SwingWorker объявляется и запускается, поскольку его необходимо вызывать в EDT. Однако ваш фрагмент кода не показывает нам, где выполняется анимация, поэтому трудно сказать, что еще может быть не так с ним.

Edit:
Основываясь на ваших последних комментариях (которые я добавил к вашему исходному сообщению), я все еще не уверен, в чем проблема, в основном из-за моего незнания о том, как работают pApplets, однако мне интересно, должен ли метод EDT вызываться в EDT возможно в методе done SwingWorker.

...