Błąd - Not on FX application thread

Błąd - Not on FX application thread
VD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
0

Witam.
Myślałem że to rutynowa funkcja ale coś się sypie. Mam kod

Kopiuj
Timer timer = new Timer(1000, new ActionListener(){
									@Override
									public void actionPerformed(ActionEvent arg0) {
										Label label = tester.getTimeLabel();
										label.setText("Przykładowy tekst");
										tester.setTimeLabel(label);				
									}
									
								});

I zamiast zmieniać Label co sekundę, wyrzuca mi błąd przy funkcji label.setText()
Not on FX application thread; currentThread = AWT-EventQueue-0
Ktoś ma pomysły jak to naprawic?

EDIT
Działający, poprawiony kod :

Kopiuj
MainController tester = new MainController();
								Timer timer = new Timer(1000, new ActionListener(){
									@Override
									public void actionPerformed(ActionEvent arg0) {
										Platform.runLater(new Runnable() {
											
											public void run() {
												tester.setTimeLabelText("Przykładowy tekst");
											}
											
										});
									}
									
								});
Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Co to za Timer?

Zmiany w GUI musisz odpalać w Dispatch Thread. Możesz to łatwo osiągnąć korzystając z Platform.runLater

VD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
0

Platform.runLater() gdzie wpisać?

SU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
1

W tym miejscu w którym modyfikujesz kontrolki działające pod kontrolą wątku od gui JavaFX. W twoim wypadku jest to ustawianie tekstu w label.

Kopiuj
label.setText("Przykładowy tekst");

Ja bym odpowiedzialność za zmiane tekstu przerzucił do klasy zmiennej tester, tworząc metodę np. setTextTimeLabel(String text)

Podejrzewam że kod poniżej jest nie potrzebny, chyba że metoda setTimeLabel robi coś więcej niż przypisanie labela do zmiennej.

Kopiuj
tester.setTimeLabel(label); 
Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
1
VanDavv napisał(a):

Platform.runLater() gdzie wpisać?

Zamiast:
jakieś instrukcje zmieniające stan GUI;
zrób:

Kopiuj
Platform.runLater(new Runnable() {
  void run() {
    jakieś instrukcje zmieniające stan GUI;
  }
});
VD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
0

Dziękuję wszystkim za pomoc ;) Kolejny raz pozytywnie jestem zaskoczony ludźmi, którzy tak chętnie pomagają - Wami. Działający kod wrzucam jako edit pierwszego posta ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.