2013-05-23 9 views
10

Mam problem podczas pracy z JavaFX i wątkami. Zasadniczo mam dwie opcje. Praca z Tasks lub Perform.runLater. Rozumiem, że dla prostych/krótkich zadań powinno być używane Perform.runLater, a dla dłuższych. Jednak nie mogę użyć żadnego z nich. Kiedy zadzwonię pod numer Thread, należy otworzyć okno dialogowe captcha w środku zadania. Podczas korzystania z Task ignoruje moją prośbę o pokazanie nowego okna dialogowego ... Nie pozwala mi utworzyć nowego etapu. Z drugiej strony, kiedy używam Platform.runLater, pokażę okno dialogowe, ale okno programu zawiesza się, dopóki nie pojawi się okno dialogowe. Potrzebuję do tego jakiegokolwiek rozwiązania. Jeśli ktoś wie, jak sobie z tym poradzić lub miał podobne doświadczenia i znalazł rozwiązanie, czekam na wiadomość od Ciebie!JavaFX działa z wątkami i GUI

+0

możliwe duplikat [JavaFX2: Czy mogę wstrzymać tło Task/Serwis] (http://stackoverflow.com/questions/14941084/javafx2-can-i- pause-a-background-task-service) – jewelsea

Odpowiedz

25

Jak puce mówi, trzeba użyć Task lub Service za rzeczy, które trzeba zrobić w tle. I Platform.runLater do robienia rzeczy w wątku aplikacji JavaFX z wątku tła.

Należy je zsynchronizować, a jedną z metod jest użycie klasy CountDownLatch.

Oto przykład:

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(); 
+0

Dokładnie to, czego szukałem. Dziękuję bardzo! – ksarunas

6

Użyj aplikacji Worker (Task, Service) z wątku aplikacji JavaFX, jeśli chcesz zrobić coś w tle.

http://docs.oracle.com/javafx/2/api/javafx/concurrent/package-summary.html

Zastosowanie Platform.runLater z wątku tła, jeśli chcesz zrobić coś na gwincie JavaFX aplikacji.

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

+0

Tworzę pracownika (zadanie). Kiedy tylko będę tego potrzebował, pokaż pop-up. Wzywam Platform.runLater, ale muszę poczekać na odpowiedź (to jest okno dialogowe wprowadzania danych), ale jeśli utworzę nowy wątek (Platform.runLater), to nie czeka na odpowiedź, a Worker kontynuuje ... Jak sobie z tym poradzić. Być może istnieje sposób, aby wstrzymać wątek roboczy czekać na dane z Platform.runLater, a następnie kontynuować ...? – ksarunas