2014-01-16 2 views
1

Привет, мне нужно обновить GUI от SWT до JavaFX и иметь проблемы прямо в начале. Основной класс наследует Thread и запускается с определенного метода (реализации интерфейса):Запуск JavaFX-контроллера в отдельном потоке

@Override 
public void mStart() { 


    this.start(); 

} 

@Override 
public void mStop() { 

    this.shell.dispose(); 

} 

Мой GUI FX создается с SceneBuilder. Вопрос в том, как управлять контроллером для запуска в другом потоке, поскольку он создается автоматически?

ответ

2

После некоторого исследования вывод: Приложение JavaFX можно запускать как другой поток из приложения без FX, просто нужно реализовать Runnable и вставить метод launch() в run(). Затем offcourse do start() в потоке, который отвечает за запуск вашего графического интерфейса. Затем, если хотите, чтобы обновить элементы управления (кнопки, этикетки, панели и т.д.) внутри другого потока вы должны сделать что-то вроде этого:

Platform.runLater(new Runnable() { 
     @Override public void run() { 
     //Update UI here  
     } 
    }); 

для получения дополнительной информации читайте сообщения: here и here

+0

Спасибо, что работает – Dinesh

1

Ну, я никогда не использовал сцены Builder ни SWT, но одна вещь, я уверен:

Применение резьбы JavaFX отвечает за заботу о любом существующем элементе JavaFX. Вы можете найти подробную информацию о том, как правильно обрабатывать элементы JavaFX here. Я думаю, что вам нужно сделать это, чтобы получить доступ к элементам JavaFX, используя поток приложений JavaFX, который вы можете использовать, используя метод runLater из класса Platform. Посмотрите:

http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#runLater%28java.lang.Runnable%29

Как всегда, мы знаем, что мы должны запускать приложения JavaFX из главного потока программы Java. Что вы можете сделать, так это использовать основной поток в любой точке вашего приложения SWT для вызова инициатора основного класса JavaFX. Например, в одной точке вашего приложения SWT все, что вам нужно сделать, это позвонить launch.

Не забудьте, однако, что основной поток (тот, который должен вызвать запуск) будет заблокирован, пока ваше приложение JavaFX не будет завершено.

Надеюсь, что это поможет, и удачи. :)

+0

да это помогло много Лоа. Но, как вы писали выше, мой основной поток блокируется после вызова метода запуска. Что делать, если я буду реализовывать runnable на моем основном классе FX и запустить запуск из метода start() в отдельном потоке? – sw1

+0

Вы имеете в виду, запустите приложение JavaFX из другого потока, кроме приложения JavaFX Application Thread? Я бы не рекомендовал его. В документации JavaFX по ссылке, которую я передал вам, четко указано, что разные потоки платформы Java имеют свою целевую цель. AH! Найди его! Проверьте это: http://docs.oracle.com/javafx/2/swt_interoperability/jfxpub-swt_interoperability.htm – Loa

+0

Я хотел запустить приложение JavaFX в отдельном потоке, чем основное, которое не является потоком FX вообще , Теперь мне нужно перейти от SWT к JavaFX и заставить его работать без необходимости внесения больших изменений в остальную часть проекта. Но проблема в том, что в главном классе SWT существовал цикл while, который работал для всего жизненного цикла приложений (после инициализации кнопок, меток и т. Д.). При использовании подхода FX возникает проблема после запуска метода primaryStage.Show(), поскольку он блокирует остальную часть потока. – sw1

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