JavaFX работает с потоками и GUI

у меня проблема при работе с JavaFX и потоками. В основном у меня есть два варианта: работа с Tasks или Platform.runLater. Как я понимаю Platform.runLater следует использовать для простых / коротких задач и Task для более длинных. Однако я не могу использовать ни один из них.

когда я называю Thread, он должен выскочить диалог captcha в середине задачи. При использовании Task, он игнорирует мою просьбу показать новый диалог... Это не позволяет мне создать новый этап.

С другой рука, когда я использую Platform.runLater, это позволяет мне показать диалог, однако главное окно программы зависает, пока не появится всплывающее диалоговое окно.

мне нужно любое решение для этого. Если кто-то знает, как справиться с этим или имел подобный опыт и нашел решение, я с нетерпением жду от вас!

2 ответов


как говорит Пюс, вы должны использовать 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();

использовать 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