JavaFX Nie odświeża label +blokuje apke

Odpowiedz Nowy wątek
2014-12-05 21:41

Rejestracja: 8 lat temu

Ostatnio: 4 lata temu

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

    }
edytowany 1x, ostatnio: diasdj, 2014-12-05 21:42

Pozostało 580 znaków

2014-12-05 21:54

Rejestracja: 15 lat temu

Ostatnio: 16 minut temu

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.

Pozostało 580 znaków

2014-12-05 22:03

Rejestracja: 7 lat temu

Ostatnio: 3 lata temu

0

Dla takich rzeczy skorzystaj z

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

Pozostało 580 znaków

2014-12-05 22:08

Rejestracja: 15 lat temu

Ostatnio: 16 minut temu

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.
nie zauważyłem tego.. masz rację, +1 :) - miiichal_er 2014-12-05 22:19

Pozostało 580 znaków

2014-12-06 03:29

Rejestracja: 8 lat temu

Ostatnio: 4 lata temu

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, 2014-12-06 03:30

Pozostało 580 znaków

Odpowiedz

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