2014-01-15 7 views
0

Я кодировал симуляцию на Java и теперь генерирую графики результатов в JavaFX. Тем не менее, я в тупике, как вызвать графики, так что, когда я пытаюсь запустить симуляцию (и генерировать графики) во второй раз, я не получаю «не могу вызвать запуск() более одного раза " ошибка. Я читал, что launch() можно вызывать только один раз, так что мне нужно изменить, чтобы вызвать графы успешно во втором запуске симуляции?Как «перезапустить» приложение JavaFX?

public class AnswerWorker extends SwingWorker<Void, Integer> { 

protected Void doInBackground() throws Exception 
{ 
    AMEC.runsimulation(); 
    return null; 
} 

protected void done() 
{ 
try { 
    Graphs.launch(Graphs.class, ""); 
    JOptionPane.showMessageDialog(InputGUI.this, AMEC.unsuccesfulpercentage + "% of iterations had trucks that had to sleep over"); 
    AMEC.unsuccesfulpercentage = 0; 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

} 
} 

с довольно стандартным классом графиков:

public class Graphs extends Application { 

    @Override public void start(Stage stage) { 
    .... 
    stage.show(); 
    } 
} 
+0

В вашем [предыдущем вопросе] (http://stackoverflow.com/questions/21132278/is-it-possible-to-draw-graphs-using-javafx-in-a-normal-java-application), Себастьян дал ответ для этого: используйте 'JFXPanel'. –

ответ

2

Почему вы используете SwingWorker в приложении JavaFX? Если ваши графики вычисляются для отображения в приложении JavaFX, нет причин для использования Thread Dispatch Thread (AWT). Если я не ошибаюсь, с выпуском JDK 8, JavaFX Application Thread и Thread Dispatch Thread will become one, так что вам пока нет причины использовать SwingWorker. Если я действительно ошибаюсь, все равно нет причин использовать SwingWorker. Хотя возможно сочетание компонентов Swing в приложениях JavaFX, вы должны использовать EDT только при манипулировании компонентами Swing, а не с узлами JavaFX. Следующая ссылка говорит, что это:

... поток приложения JavaFX является другим потоком из свинга и AWT событие диспетчерского Thread (EDT), поэтому необходимо соблюдать осторожность при внедрении JavaFX кода в Swing-приложения ...

Источник: http://docs.oracle.com/javafx/2/architecture/jfxpub-architecture.htm

чтобы узнать, как вы можете поместить процессы должны быть сделаны в фоновом режиме, а также выяснить, какой поток отвечает за обработку элементов JavaFX, проверить эту ссылку:

http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

Что касается вашего вопроса, я считаю, что начало приложения JavaFX следует вызывать только один раз. Настолько много, что при запуске приложения JavaFX поток основного метода захватывается и возвращается только при завершении приложения JavaFX. Просто посмотрите Application DOC (особенно this часть). Следует также отметить, что жизненный цикл приложения JavaFX задается следующими шагами:

Жизненный цикл

Точка входа для приложений JavaFX является класс Application. Среда выполнения JavaFX выполняет следующие действия, чтобы всякий раз, когда приложение запущено:

  1. Создает экземпляр указанного класса Application
  2. вызывает метод инициализации()
  3. вызывает начальную (javafx.stage. Этап)
  4. Ожидает, что приложение закончит работу, когда произойдет один из : приложение вызывает Платформа.Выход() последнее окно было закрыто, а атрибут implicitExit на платформе верно
  5. вызывает метод

Вы можете использовать неправильный подход остановки(). Я считаю, что вы должны оставить приложение JavaFX запущенным, пока вы что-то обрабатываете. После того как вы обработали то, что хотите в фоновом режиме, вы должны сделать приложение JavaFX показать результаты. Способ запуска приложения JavaFX во время обработки в фоновом режиме полностью зависит от вас. Возможно, вам нужно скрыть окно, пока что-то будет обработано, и снова отобразите его с помощью вашей диаграммы. Как я уже сказал, это то, что вам придется решать. Я рекомендую вам ознакомиться с документацией по классам, относящейся к оконной системе, начиная с Window, а затем Stage.

Любые вопросы, мы здесь. Удачи! :)

EDIT:

Из того, что я вижу, то jewelsea пользователь правильно. По-видимому, не является уверенным, что EDT и Application Application Java станут одним из них (было бы интересно, если бы это произошло). Но в любом случае будьте осторожны, чтобы не путать себя с использованием обоих потоков.

+0

«С выпуском JDK 8 поток приложений JavaFX и Thread Dispatch Thread станет единым» => Вы ошибаетесь. Такая поддержка поддерживается только в JDK 8 с использованием недокументированного экспериментального флага. По умолчанию поток приложений JavaFX и потоки отправки событий - это разные потоки. – jewelsea

Смежные вопросы