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
Odpowiedz
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();
Dokładnie to, czego szukałem. Dziękuję bardzo! – ksarunas
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.
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
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