Diskuze: javafx update TableView ObservableListu
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, je opravdu potřeba upravovat tabulku pomocí externích textboxů?
Jednodušší by bylo upravovat rovnou řádky v tabulce.
Mimochodem příkaz:
table.getSelectionModel().getSelectedItem()
ti vrátí referenci na tvoje UserData, takže tam bys rovnou mohl ty data měnit, tedy za předpokladu, že ve třídě UserData máš i settry pro dané property.
Když tomu nebudeš rozumět, tak napiš a já to vysvětlím lépe...
díky moc, přesně, jak tam dostat ty settry?
Pak bych mohl psát něco jako
data.setKod(txtOperator.getText());
Settry dáš normálně do třídy UserData.
Jenom bych se chtěl zeptat, proč používáš StringProperty místo
obyčejného Stringu?
public void setOperator(String operator) {
// Tady máš dvě možnosti:
// 1. Necháš si StringProperty a pak bude setter vypadat takto:
this.Operator = new SimpleStringProperty(Operator);
// 2. Nebo upravíš StrinProperty na obyčejný *String* a pak to bude takhle:
this.Operator = operator.
}
>proč používáš StringProperty
někde jsem čet, že se to tak má dělat
čerpal jsem tady, podle mého zmateného dotazu tam:
http://www.javafxapps.in/…atabase.html
ale teď tam to zdůvodnění StringProperty nevidím, že by někde jinde..?
v celkovém kontextu toho vzpomínaného vzoru to nebude tak prosté.
Když použiju obyčejný String, musel bych předělat i kód na plnění TableView, takto to TableView nenaplní.
A když nechám StringProperty, tak ty settery sice projdou překladačem,
ale jejich volání
data.setKod(txtOperator.getText());
vypíše:
cannot find symbol
symbol: method setKod(String)
location: variable data of type ObservableList<UserData>
a ani nezmiňuje, že to není String, ale StringProperty, a přetypovat mi to
nějak nejde.
Ještě, že chodí ta původní konstrukce
//mám referenci
table.getSelectionModel().getSelectedItem()
//mám ten setter
setKod
//rýsuje se
data.setKod
//mám hodnotu, kterou to chci naplnit
txtOperator.getText()
//ale nevymyslel jsem, jak to zapsat.
Tak mě napadla ještě jedna možnost. Ty teda chceš při výběru řádku
v tabulce, aby jsi data mohl editovat někde v textových polích.
Když vybereš řádku v tabulce, tak pomocí
table.getSelectionModel().getSelectedItem()
si vytáhneš referenci na daný řádek a uložíš si jí někam do proměnné. Dále z této reference vytáhneš data a zobrazíš je v textfieldech. Nakonec nadefinuješ každému textfieldu, že třeba po zmáčknutí ENTERU se uloží hodnota z textfieldu do dat. To uložení by neměl být problém, protože máš referenci na právě vybraná data.
//a uložit to ..právě .. nevím jak
//udělal jsem dva pokusy, oba špatné, první toto:
UserData vybrano = (UserData)
table.getSelectionModel().getSelectedItem();
vybrano.setKod(txtOperator.getText());
//uloží data, ale mimo
//a druhý nápad
data.setKod(txtOperator.getText());
//je nesmysl, protože není použita reference a nevím, kam ji tam "v
máčknout"
To první by mělo být správně, já to takhle píšu. Jestliže Ti to
nefunguje, tak bude problem s tím settrem.
Jo ještě jsem si všiml, že přetypováváš ten selectedItem na správný
typ - tomu se dá vyhnout tak, že tabulce nastavíš, jaký bude uchovávat
data.
TableView table = new TableView<UserData>();
//Díky za typ tabulky, už nepřetypovávám .
//Asi se špatně vyjadřuju k původnímu problému. Jak píšu výše,
tohle chodí:
//vymažu a přidám
data.remove(table.getSelectionModel().getSelectedItem());
data.add(new UserData(txtOperator.getText(), txtKod.getText(),
txtSkupina.getText()));
//jak zapsat update, mám-li settry a referenci?
//totiž, použiju-li to vybráno, viz. výše tak to je nová instance původního jediného záznamu a s tou pracovat nemá smysl ... aspoň já to tak chápu. Musím to zapsat do těch dat "data" na místo dané referencí.
table.getSelectionModel().getSelectedItem()
Ti nevrátí novou instanci, pouze referenci, proto s tim můžeš manipulovat jak potřebuješ. Na ty settery se ještě podívám.
Chtěl bych se omluvit za špatnou nápovědu ohledně těch settrů. Teď jsem to zkoušel a snad našel řešení:
public void setOperator(String Operator) {
this.Operator.setValue(Operator);
}
Teď by ten setter už měl fungovat správně.
D ě k u j i.
Je to tak, funguje.
Není vůbec zač, jenom by bylo dobré, kdyby jsi označil správné řešení
Zobrazeno 15 zpráv z 15.