Я пишу приложение, используя 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();
}
}