JavaFX работает с потоками и графическим интерфейсом

У меня проблема при работе с JavaFX и Threads. В принципе у меня есть два варианта. Работа с Tasks или Perform.runLater. Насколько я понимаю, Perform.runLater следует использовать для простых/коротких задач, а Task для более длинных. Однако я не могу использовать ни один из них. Когда я вызываю Thread, он должен открыть диалог "captcha" в середине задачи. При использовании Task он игнорирует мой запрос, чтобы показать новый диалог... Он не позволяет мне создавать новый этап. С другой стороны, когда я использую Platform.runLater, он позволяет мне показывать диалог, однако окно программы зависает, пока не появится всплывающее диалоговое окно. Мне нужно какое-то решение для этого. Если кто-то знает, как справиться с этим или имел какой-то подобный опыт, и нашел решение, которое я с нетерпением жду услышать от вас!

Ответ 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.

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