JavaFX Nie odświeża label +blokuje apke

0

Nie potrafię poradzić sobie z odświeżaniem bieżącej wartości Etykiety.
Tworzę watek w którym następuję odliczanie do 10.
Po wciśnięciu przycisku StartButton apka zatrzymuje się na 10s po czym wyświetla liczbę 10.
Proszę o podpowiedzi.

 public void initialize(URL arg0, ResourceBundle arg1) {
		
	StartButton.setOnAction(new EventHandler<ActionEvent>() {

		@Override
		public void handle(ActionEvent event) {
        
			    Watek wk = new Watek();
				Thread thrr = new Thread(wk);
				thrr.start();
				
				while(thrr.isAlive()){
			    try {
					Watek.sleep(1000);
					Czas.setText(Integer.toString(Watek.getSekundy()));
					

				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
					
				}
		
		}

Kod wątku

public void run() {

		try {
			
			for(int i=0;i<10;i++) {
				Thread.sleep(1000);
			    setSekundy(getSekundy()+1);	
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
1

Blokujesz JavaFX Application Thread, a tylko w nim jest odświeżanie GUI. Poczytaj to: https://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

0

Dla takich rzeczy skorzystaj z

Platform.runLater(new Runnable) {
  public void run() {
  // tu Twój kod
  }
}
2

@miiichal_er
Moim zdaniem samo Platform.runLater nie załatwi sprawy, jeśli kolo będzie robił Thread.sleep w wątku UI-owym. Tutaj trzeba użyć Taska.

0

Poradziłem sobie, dzięki wielkie za pomoc.

Stworzyłem Service dla którego utworzyłem obiekt Task w którym obsłużyłem wątek.
W tasku użyłem metody "updateMassage" po to żeby móc zbindować Jlabel z wartością aktualną w wątku.

czas.textProperty().bind(backgroundThread.messageProperty()); // gdzie backgroundThread - to obiekt Service

1 użytkowników online, w tym zalogowanych: 0, gości: 1