Avatar
Matěj Kripner
Redaktor
Avatar
Matěj Kripner:

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
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Atrament
Člen
Avatar
Odpovídá na Matěj Kripner
Atrament:

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
Redaktor
Avatar
Odpovídá na Atrament
Matěj Kripner:

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
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Atrament
Člen
Avatar
Odpovídá na Matěj Kripner
Atrament:

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:

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
Redaktor
Avatar
Odpovídá na Atrament
Matěj Kripner:

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
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Atrament
Člen
Avatar
Odpovídá na Matěj Kripner
Atrament:

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
Redaktor
Avatar
Odpovídá na Atrament
Matěj Kripner:

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
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Odpovídá na Matěj Kripner
Ladislav Ondris:

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
Člen
Avatar
Odpovídá na Matěj Kripner
Atrament:

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
Redaktor
Avatar
Odpovídá na Atrament
Matěj Kripner:

Ano, jednotlivé objekty mám v ObservableListu.

Nahoru Odpovědět 5.9.2014 7:28
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Ladislav Ondris
Matěj Kripner:

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
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Atrament
Člen
Avatar
Odpovídá na Matěj Kripner
Atrament:

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
Redaktor
Avatar
Odpovídá na Atrament
Matěj Kripner:

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
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Atrament
Člen
Avatar
Odpovídá na Matěj Kripner
Atrament:

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
Redaktor
Avatar
Odpovídá na Atrament
Matěj Kripner:

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
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Atrament
Člen
Avatar
Odpovídá na Matěj Kripner
Atrament:

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
Redaktor
Avatar
Odpovídá na Atrament
Matěj Kripner:

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
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Atrament
Člen
Avatar
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Atrament
Matěj Kripner:

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
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
MartinF
Člen
Avatar
Odpovídá na Matěj Kripner
MartinF:

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. února 22:22
 
Nahoru Odpovědět 2. února 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.