JavaFX Nie odświeża label +blokuje apke

JavaFX Nie odświeża label +blokuje apke
diasdj
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 8 lat
  • Postów:18
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.

Kopiuj
 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

Kopiuj
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();
		}

	}
edytowany 1x, ostatnio: diasdj
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:27 minut
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


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
miiichal_er
miiichal_er
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 3 lata
  • Postów:9
0

Dla takich rzeczy skorzystaj z

Kopiuj
Platform.runLater(new Runnable) {
  public void run() {
  // tu Twój kod
  }
}
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:27 minut
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
miiichal_er
miiichal_er
nie zauważyłem tego.. masz rację, +1 :)
diasdj
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 8 lat
  • Postów:18
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

edytowany 1x, ostatnio: diasdj

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.