Mam pytanie dotyczące wielowątkowości i powiązania StringProperty.Błąd wielowątkowości podczas wiązania StringProperty
Mam klasę CacheManager
, która zawiera Thread
, która aktualizuje moją pamięć podręczną ze zmianami na serwerze. Teraz chcę powiadomić użytkownika z tekstem i procentem postępu (które są Label
i ProgressBar
w JavaFX). Używam do tego celu publicznych statystyk: DoubleProperty
i StringProperty
, które są zdefiniowane w klasie CacheManager
. Ja po prostu związać go tak:
progressBar.progressProperty().bind(CacheManager.progress);
someLabel.textProperty().bind(CacheManager.status);
Teraz w wątku Updater zaktualizować te Properties
. Z DoubleProperty
działa to dobrze, a ProgressBar
doskonale pokazuje postęp. Jednak aktualizowanie Label
ze statusem (który to tekst z StringProperty
) wyrzuca błąd: java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-9
Teraz moje pytanie brzmi: Dlaczego praca DoubleProperty
dobrze, natomiast StringProperty
zgłasza błąd? Jaka jest różnica między nimi, biorąc pod uwagę wielowątkowość?
Wszelkie pomysły dotyczące przeprojektowania są również mile widziane i każda pomoc jest bardzo cenna!
Szukałeś przyczyny "IllegalStateException: Nie w wątku aplikacji FX"? –
Właśnie zgłasza błąd w aktualizacji 'Thread', kiedy próbuję zmienić tekst po raz drugi. A więc w tym wierszu: 'status.set (" Aktualizowanie ... ")' – bashoogzaad
I * bet * jest tak, ponieważ skórka 'ProgressBar' ustawia' InvalidationListener' na 'progressProperty', podczas gdy skórka' Label' ustawia detektor zmian na 'textProperty'. Mimo, że zachowanie 'progressBar.progressProperty' jest wygodniejsze, myślę, że zachowanie' Label.textProperty' jest bardziej zwięzłe z tym, że wszystkie zmiany interfejsu muszą mieć miejsce w wątku UI. Użyj 'Platform.runLater()' lub weź pod uwagę klasę JavaFX 'javafx.concurrent.Service', która oferuje wymagane funkcje. –