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 update TableView ObservableListu

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

Aktivity
Avatar
j.c.
Člen
Avatar
j.c.:23.6.2015 13:07

//mám
private ObservableLis­t<UserData> data;

.....
//mám tableview (jménem table) a textová pole (jménem txtOperator, txtKod.. ) z vybraného záznamu v tableview
//chtěl bych aby po zápisu do textových polí proběhl update toho tableview
//toto funguje

data.remove(ta­ble.getSelecti­onModel().get­SelectedItem());
data.add(new UserData(txtO­perator.getTex­t(), txtKod.getText(), txtSkupina.get­Text()));

//ale jsou to dva řádky kódu, dvě operace
//šlo by napsat nějak
data.set(......
// a nandat tam texty z textovových polí?

Díky za nasměrování.

//data jsou definována takto
public static class UserData {

private StringProperty Operator;
private StringProperty Kod;
private StringProperty Skupina;

private UserData(String Operator, String Kod, String Skupina) {
this.Operator = new SimpleStringPro­perty(Operator);
this.Kod = new SimpleStringPro­perty(Kod);
this.Skupina = new SimpleStringPro­perty(Skupina);
}

public StringProperty OperatorProperty() {
return Operator;
}

public StringProperty SkupinaProperty() {
return Skupina;
}

public StringProperty KodProperty() {
return Kod;
}

}

 
Odpovědět
23.6.2015 13:07
Avatar
Odpovídá na j.c.
Petr Štechmüller:23.6.2015 14:24

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...

Nahoru Odpovědět
23.6.2015 14:24
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
j.c.
Člen
Avatar
Odpovídá na Petr Štechmüller
j.c.:23.6.2015 15:58

díky moc, přesně, jak tam dostat ty settry?

Pak bych mohl psát něco jako
data.setKod(txtO­perator.getTex­t());

 
Nahoru Odpovědět
23.6.2015 15:58
Avatar
Odpovídá na j.c.
Petr Štechmüller:23.6.2015 16:05

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.
}
Editováno 23.6.2015 16:07
Nahoru Odpovědět
23.6.2015 16:05
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
j.c.
Člen
Avatar
Odpovídá na Petr Štechmüller
j.c.:23.6.2015 16:44

>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..?

 
Nahoru Odpovědět
23.6.2015 16:44
Avatar
j.c.
Člen
Avatar
Odpovídá na j.c.
j.c.:23.6.2015 17:59

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(txtO­perator.getTex­t());

vypíše:
cannot find symbol
symbol: method setKod(String)
location: variable data of type ObservableLis­t<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 :D

 
Nahoru Odpovědět
23.6.2015 17:59
Avatar
j.c.
Člen
Avatar
Odpovídá na j.c.
j.c.:23.6.2015 18:32

//mám referenci
table.getSelec­tionModel().get­SelectedItem()
//mám ten setter
setKod
//rýsuje se
data.setKod
//mám hodnotu, kterou to chci naplnit
txtOperator.get­Text()
//ale nevymyslel jsem, jak to zapsat.

 
Nahoru Odpovědět
23.6.2015 18:32
Avatar
Odpovídá na j.c.
Petr Štechmüller:23.6.2015 18:38

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.

Nahoru Odpovědět
23.6.2015 18:38
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
j.c.
Člen
Avatar
Odpovídá na Petr Štechmüller
j.c.:23.6.2015 18:58

//a uložit to ..právě .. nevím jak
//udělal jsem dva pokusy, oba špatné, první toto:
UserData vybrano = (UserData) table.getSelec­tionModel().get­SelectedItem();
vybrano.setKod(txtO­perator.getTex­t());
//uloží data, ale mimo :)
//a druhý nápad
data.setKod(txtO­perator.getTex­t());
//je nesmysl, protože není použita reference a nevím, kam ji tam "v máčknout"

 
Nahoru Odpovědět
23.6.2015 18:58
Avatar
Odpovídá na j.c.
Petr Štechmüller:23.6.2015 19:03

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>();
Editováno 23.6.2015 19:03
Nahoru Odpovědět
23.6.2015 19:03
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
j.c.
Člen
Avatar
Odpovídá na Petr Štechmüller
j.c.:23.6.2015 19:32

//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(ta­ble.getSelecti­onModel().get­SelectedItem());
data.add(new UserData(txtO­perator.getTex­t(), txtKod.getText(), txtSkupina.get­Text()));

//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í.

 
Nahoru Odpovědět
23.6.2015 19:32
Avatar
Odpovídá na j.c.
Petr Štechmüller:23.6.2015 20:21
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.

Nahoru Odpovědět
23.6.2015 20:21
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na j.c.
Petr Štechmüller:23.6.2015 20:28

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ě.

Nahoru Odpovědět
23.6.2015 20:28
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
j.c.
Člen
Avatar
Odpovídá na Petr Štechmüller
j.c.:23.6.2015 20:51

D ě k u j i.

Je to tak, funguje.

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
23.6.2015 20:51
Avatar
Petr Štechmüller:23.6.2015 20:52

Není vůbec zač, jenom by bylo dobré, kdyby jsi označil správné řešení :)

Nahoru Odpovědět
23.6.2015 20:52
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
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 15 zpráv z 15.