Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Práce s grafickými komponenty

Aktivity
Avatar
Matěj Kripner
Tvůrce
Avatar
Matěj Kripner:2.9.2014 19:24

Zdravím,
pracuji s JavaFX a mám ve své aplikaci nějaká data, která vkládám do tabulky. Tyto data se pravidelně obměňují a potřeboval bych, aby se obnovovala i tabulka s daty. Jenže pokud se pokusím s klasickým vláknem jakkoli pracovat s grafickými komponenty, vyvolá se tato výjimka:

Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4

Nevíte někdo, jak tuto situaci řešit? Četl jsem něco o background-worker, ale jaksi to nechápu :D

 
Odpovědět
2.9.2014 19:24
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na Matěj Kripner
Atrament:3.9.2014 21:25

S JavaFX mám jen minimální zkušenosti, ale aspoň se pokusím :) - máš ty data v něčem co implementuje interface Observable? S tím si totiž standardní widgety v JavaFX rozumějí out-of-box - prostě máš data třeba v ObservableLis­t<TvůjTyp> a ty zobrazuješ v ListView<TvůjTyp>.
To propojení zajistíš pomocí setItems(Obser­vableList) na ListView a máš hotovo. Když pak něco přidáš/upravíš/o­debereš v ObservableList tak se to automaticky projeví v ListView.

 
Nahoru Odpovědět
3.9.2014 21:25
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Atrament
Matěj Kripner:3.9.2014 21:47

Bohužel GridPane tuto metodu neobsahuje :) Navíc o tento problém mi nešlo, to se dá obejít. Jde o to, že jiná než JavaFX vlákna nemohou manipulovat s grafickými komponenty, jinak se vyvolá výjimka uvedená výše. Vše už jsem ale vyřešil, takže mám už zase jiný problém :D

 
Nahoru Odpovědět
3.9.2014 21:47
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na Matěj Kripner
Atrament:3.9.2014 21:53

Neposkytl jsi žádné bližší info, takže jsem možná mimo, ale ty používáš na zobrazení tabulky dat GridPane? Nebylo by lepší TableView?

 
Nahoru Odpovědět
3.9.2014 21:53
Avatar
Odpovídá na Atrament
Ladislav Ondris:4.9.2014 13:06

S tebou souhlasím. S TableView to bylo porprvé težké, ale naučil jsem se to a přišel jsem i na to, jak obnovit v něm data.. table.getColum­n().clear(); a následně znovu přidat všechny sloupce: table.getColum­n().addAll(co­lumn1, column2, column3);

Nahoru Odpovědět
4.9.2014 13:06
Pokud neděláš chyby, nepracuješ na dostatečně těžkých problémech.
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Atrament
Matěj Kripner:4.9.2014 17:59

Máš pravdu, to bude lepší :D Už jsem překopal aplikaci, která teď používá TableView. Jak už jsem říkal, vynáším do tabulky objekty(data). Pokud se změní seznam těchto objektů, data v tabulce se automaticky obnoví. Pokud však změním jenom nějaký vnitřní stav objektu, nic se samozřejmě nestane. Potřeboval bych tedy nějakou metodu na refreshování tabulky, nebo lépe jen jednoho sloupce. Bohužel s tím nemám ale žádné zkušenosti, takže zase prosím o pomoc.

Editováno 4.9.2014 17:59
 
Nahoru Odpovědět
4.9.2014 17:59
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na Matěj Kripner
Atrament:4.9.2014 19:35

K tomu slouží JavaFX properties. Vystavíš fieldy objektu, které chceš aby TableView sledovalo pomocí property getterů, např máš-li třídu Person a v ní String field name, tak udělej getter

public SimpleStringProperty nameProperty()
{
return name;
}

a mělo by to snad fungovat.

 
Nahoru Odpovědět
4.9.2014 19:35
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Atrament
Matěj Kripner:4.9.2014 21:08

Tak to nějak nefunguje. Pokud změním hodnotu SimpleStringPro­perty pomocí metody set, v tabulce se nic nezmění. Ale podle všech zdrojů by to mělo fungovat, takže se ještě pokusím to rozchodit :D Díky za radu!

 
Nahoru Odpovědět
4.9.2014 21:08
Avatar
Odpovídá na Matěj Kripner
Ladislav Ondris:4.9.2014 21:54

obnovení tabulky jsem vyřešil jednoduše :D

table.getColumn().clear();
table.getColumn().addAll(column1, column2, column3);
Nahoru Odpovědět
4.9.2014 21:54
Pokud neděláš chyby, nepracuješ na dostatečně těžkých problémech.
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na Matěj Kripner
Atrament:5.9.2014 6:36

A máš to v nějaké té Observable kolekci? Protože jestli ne, tak to fungovat nebude.

 
Nahoru Odpovědět
5.9.2014 6:36
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Atrament
Matěj Kripner:5.9.2014 7:28

Ano, jednotlivé objekty mám v ObservableListu.

 
Nahoru Odpovědět
5.9.2014 7:28
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Ladislav Ondris
Matěj Kripner:5.9.2014 7:32

Tak jasně, takhle už jsem to měl taky. Jde o to, že vlákno poběží na pozadí programu a potřebuju, aby bylo co nejvýkonnější. Beru to jako poslední řešení :)

 
Nahoru Odpovědět
5.9.2014 7:32
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na Matěj Kripner
Atrament:5.9.2014 19:20

Hmm tak pak nevím, taky může jít o nějaký bug, četl jsem kdesi že konkrétně okolo TableView nějaký takový byl, jestli už je to opravené to nevím.

 
Nahoru Odpovědět
5.9.2014 19:20
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Atrament
Matěj Kripner:5.9.2014 19:59

Taky je problém v tom, že se mi místo hodnot do tabulky vypisuje metoda toString() z SimpleStringPro­perty. Takže místo "hodnota" mám v tabulce něco jako "SimpleStringPro­perty[value="hod­nota"]".

 
Nahoru Odpovědět
5.9.2014 19:59
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na Matěj Kripner
Atrament:6.9.2014 14:37

Hele tak nejspíš jsem tě nechtíc mystifikoval zastaralým postupem - dneska už se koukám v JavěFX dělá zas všechno jinak - http://docs.oracle.com/…rmediate.htm#… je dobrý tutoriál jak se s TableView zachází podle nejnovějších principů. Mimochodem, časté překopávání JavaFX je jedním z důvodů, proč jsem tomu nikdy nevěnoval víc než letmou pozornost...

 
Nahoru Odpovědět
6.9.2014 14:37
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Atrament
Matěj Kripner:7.9.2014 20:41

V tom článku je ukázán de-facto stejný postup, jaký jsi mi předložil :) Stále ale nefunguje obnovování dat. Zkusím nějaké uvedené zdroje, třeba se to povede :)

 
Nahoru Odpovědět
7.9.2014 20:41
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na Matěj Kripner
Atrament:8.9.2014 6:48

Princip je prakticky stejný, změnila se jmenná konvence - teďka ty gettery a settery odpovídají více klasickým Java Bean konvencím, takže začínají get a set. Zkusil jsem si narychlo zplácat jednoduchý Address book podle toho jak je to v tom tutotiálu co jsem sem hodil, a funguje to dle očekávání, takže tam někde máš nějakou zradu :)

 
Nahoru Odpovědět
8.9.2014 6:48
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Atrament
Matěj Kripner:8.9.2014 16:57

Funguje i obnovování dat? Tím myslím, když změníš vnitřní stav zobrazovaného objektu, změní se i data v tabulce?

 
Nahoru Odpovědět
8.9.2014 16:57
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na Matěj Kripner
Atrament:8.9.2014 22:47

Jj přesně tak.

 
Nahoru Odpovědět
8.9.2014 22:47
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Atrament
Matěj Kripner:14.9.2014 16:01

Juch :D Tak konečně to snad bude fungovat! Šel jsem na to přes vlastní TableCell a vypadá to dobře. Teď se ale zase nějak pomátla databáze, ze které data vytahávám, takže práce zase dost :D Díky všem za pomoc!

 
Nahoru Odpovědět
14.9.2014 16:01
Avatar
MartinF
Člen
Avatar
Odpovídá na Matěj Kripner
MartinF:2.2.2016 22:21

Ahoj, chtěl bych se zeptat jak si se vypořádal s tou chybou, co zmiňuješ nahoře.Mám trošku jinou: java.lang.Ille­galStateExcep­tion: Not on FX application thread; currentThread = pool-2-thread-1
Jedná se o jeden prográmek, kde po každé minutě to spustí metodu, která zjistí jestli je nějkaý čas uvnitř textfieldu stejný s realným časem a pustí mi to dialogové okno, --> Alert. A okno mi to nespustí a napíše chybu.

Editováno 2.2.2016 22:22
 
Nahoru Odpovědět
2.2.2016 22:21
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 21 zpráv z 21.