NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: javaFX překreslení formuláře

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
tomekmichalhu:17.9.2017 11:03

Dobrý den, mám metodu která pro kliknutí na tlačítko provede výpočet který trvá několik minut. Chtěl jsem ještě před výpočtem vypsat label který hlásí že program počítá, ale vykreslení se provede až po doběhnutí výpočtu. Dá se nějak zařídit aby se vykreslil dříve?

 
Odpovědět
17.9.2017 11:03
Avatar
Odpovídá na tomekmichalhu
Petr Štechmüller:17.9.2017 11:10

Ahoj, bez kódu se těžko radí. Jistě to nějak zařídit jde...

Nahoru Odpovědět
17.9.2017 11:10
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
tomekmichalhu:17.9.2017 12:02

kód má víc jak 1000 řádků v 6ti souborech, pochybuju že se to bude chtít někomu luštit. Navíc 90% toho kódu je matika která se layoutu vůbec netýká.

@FXML
private Label lab;

public void Tlacitko() {
        lab.setText("Tohle chci napsat");
        vypocet();
        //tady se to teprve napíše
}
 
Nahoru Odpovědět
17.9.2017 12:02
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na tomekmichalhu
Jan Lupčík:17.9.2017 12:10

Zkus mrknout na vlákna, myslím, že to by ti mohlo pomoct. :)

Editováno 17.9.2017 12:10
Nahoru Odpovědět
17.9.2017 12:10
TruckersMP vývojář
Avatar
Odpovídá na tomekmichalhu
Petr Štechmüller:17.9.2017 12:15

Tvůj problém je, že provádíš zřejmě složitý výpočet v hlavním vlákně aplikace. To je velmi problémové a následky se projevují například tím, že se label nastaví až po výpočtu. Jak tu zaznělo výše, podívej se na vlákna.
Když přesuneš výpočet do jiného vlákna, ulehčíš tak hlavnímu vláknu práci a to se v kldu bude moci starat pouze o GUI.

Případně se podívej na třídu Task. Zřejmě to bude to pravé ořechové.
Pokud tomu nebudeš rozumět, tak zkus nejdříve obyčejně vytvořit nové vlákno (new Thread()) a kód spustit v něm. Zde pak budou pouze problémy se synchronizací, pokud budeš chtít zobrazovat například průběh výpočtu čí výsledek.

Nahoru Odpovědět
17.9.2017 12:15
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Marian Benčat:17.9.2017 12:54

Všechny rozumne UI FRAMEWORKy jsou single thread apartment (proto je react Native 2 vláknovy a vše musí složitě dispatchovat), což znamená, že se vše provadi v jednom vlakne a je tam fronta úloh.. Pokus tedy dojde k eventu - v tvém případě zmáčknuti tlačítka, tak se zařadí tento event do fronty a až za něj rerender().. Z toho důvodu se tomu labelu v paměti skutečně nastaví správně text a už po té první rádce je nastavený.. Ale prekresleni nastane až jako další úkol ve frontě.. Tedy po com co se dokončí celý event handler(celá metoda tlačítko).

Nahoru Odpovědět
17.9.2017 12:54
Totalitní admini..
Avatar
Bertram
Člen
Avatar
Odpovídá na tomekmichalhu
Bertram:20.9.2017 23:05

Na to musíš alespoň takto:

@FXML
    private Label label;

    @FXML
    private void Tlacitko(ActionEvent event) {
        label.setText("Tohle chci napsat");
        vypocet();
    }

    private void vypocet() {
        Thread pocty = new Thread(() -> {
            for (int i = 0; i < 500000; i++) {
                System.out.println(i);
            }
            Platform.runLater(() -> label.setText("Dopočítáno"));
        });
        pocty.setDaemon(true);
        pocty.start();
    }

Jiný přístup viz:
Worker<V>, Task<V>, Service<V>, ScheduledService<V>

 
Nahoru Odpovědět
20.9.2017 23:05
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.