У меня проблема при работе с JavaFX и Threads. В принципе у меня есть два варианта. Работа с Tasks
или Perform.runLater
. Насколько я понимаю, Perform.runLater
следует использовать для простых/коротких задач, а Task
для более длинных. Однако я не могу использовать ни один из них. Когда я вызываю Thread
, он должен открыть диалог "captcha" в середине задачи. При использовании Task
он игнорирует мой запрос, чтобы показать новый диалог... Он не позволяет мне создавать новый этап. С другой стороны, когда я использую Platform.runLater
, он позволяет мне показывать диалог, однако окно программы зависает, пока не появится всплывающее диалоговое окно. Мне нужно какое-то решение для этого. Если кто-то знает, как справиться с этим или имел какой-то подобный опыт, и нашел решение, которое я с нетерпением жду услышать от вас!
JavaFX работает с потоками и графическим интерфейсом
Ответ 1
Как говорит puce, вы должны использовать Task
или Service
для вещей, которые вам нужно делать в фоновом режиме. И Platform.runLater
делать что-то в потоке приложения JavaFX из фонового потока.
Вы должны синхронизировать их, и один из способов сделать это - использовать класс CountDownLatch
.
Вот пример:
Service<Void> service = new Service<Void>() {
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
//Background work
final CountDownLatch latch = new CountDownLatch(1);
Platform.runLater(new Runnable() {
@Override
public void run() {
try{
//FX Stuff done here
}finally{
latch.countDown();
}
}
});
latch.await();
//Keep with the background work
return null;
}
};
}
};
service.start();
Ответ 2
Используйте Worker
(Task
, Service
) из потока приложений JavaFX, если вы хотите что-то сделать в фоновом режиме.
http://docs.oracle.com/javafx/2/api/javafx/concurrent/package-summary.html
Используйте Platform.runLater
из фонового потока, если вы хотите что-то сделать в потоке приложения JavaFX.