Tabulky v Javě
Z MiS
(Rozdíly mezi verzemi)
m (Přidána kategorie GUI) |
m (→javax.swing.table.AbstractTableModel: Doplnění vysvětlení, oprava gramatických chyb.) |
||
| Řádka 13: | Řádka 13: | ||
== <code>javax.swing.table.AbstractTableModel</code> == | == <code>javax.swing.table.AbstractTableModel</code> == | ||
| − | * Rozhraní <code>TableModel</code> má mnoho metod, které by se u většiny tabulek | + | * Rozhraní <code>TableModel</code> má mnoho metod, které by se u většiny tabulek opakovaly. |
| − | * Abstraktní třída <code>AbstractTableModel</code> | + | * Abstraktní třída <code>AbstractTableModel</code> nabízí standardní implementaci většiny metod rozhraní <code>TableModel</code>. Stačí tedy zdědit tyto metody a předefinovat ty, u kterých vyžadujeme jiné než standardní chování. |
| Řádka 22: | Řádka 22: | ||
; Abstraktní metody (musí být předefinovány) | ; Abstraktní metody (musí být předefinovány) | ||
| + | Tyto metody volá třída <tt>JTable</tt>. Sdělíme jí tak, jaká data má v tabulce zobrazovat a jak velká má být tabulka. | ||
* <code>int getRowCount()</code> | * <code>int getRowCount()</code> | ||
* <code>int getColumnCount()</code> | * <code>int getColumnCount()</code> | ||
| Řádka 49: | Řádka 50: | ||
| − | ; Pokud se změní data | + | ; Pokud se změní data, je to třeba třídě <tt>JFrame</tt> sdělit |
| − | * K tomu stačí zavolat připravené metody, které zdědíme ze třídy <code>AbstractTableModel</code> | + | * K tomu stačí zavolat připravené metody, které zdědíme ze třídy <code>AbstractTableModel</code>. |
* <code>void fireTableDataChanged()</code> — obecná změna dat | * <code>void fireTableDataChanged()</code> — obecná změna dat | ||
* <code>void fireTableRowsDeleted(int firstRow, int lastRow)</code> — smazání daných řádků | * <code>void fireTableRowsDeleted(int firstRow, int lastRow)</code> — smazání daných řádků | ||
* a další... | * a další... | ||
| − | |||
| − | |||
| − | |||
== <code>javax.swing.JScrollPane</code> == | == <code>javax.swing.JScrollPane</code> == | ||
Verze z 9. 6. 2014, 11:53
Více viz: Oracle.com > Tutorial > Table.
javax.swing.JTable
- Zobrazuje data v podobě tabulky.
- Data pro zobrazení čerpá z libovolné třídy, která implementuje interface
TableModel
JTable table = new JTable(new MyTableModel());
javax.swing.table.AbstractTableModel
- Rozhraní
TableModelmá mnoho metod, které by se u většiny tabulek opakovaly. - Abstraktní třída
AbstractTableModelnabízí standardní implementaci většiny metod rozhraníTableModel. Stačí tedy zdědit tyto metody a předefinovat ty, u kterých vyžadujeme jiné než standardní chování.
- Řeší ošetření události a uložení posluchačů (listenerů).
- Pokud neřekneme jinak, tabulka je standardně needitovatelná.
- Abstraktní metody (musí být předefinovány)
Tyto metody volá třída JTable. Sdělíme jí tak, jaká data má v tabulce zobrazovat a jak velká má být tabulka.
-
int getRowCount() -
int getColumnCount() -
Object getValueAt(int row, int column)- vrací obsah buňky na řádku row a ve sloupci column
- Lze předefinovat také další metody
-
String getColumnName(int col)- popis sloupce, tedy co se má zobrazit v hlavičce sloupce
- <code>boolean isCellEditable(int row, int col)
- pokud vrátí <code>true, pak bude buňka na řádku
rowa ve sloupcicoleditovatelná - při zapsání hodnoty
JTablezavolá metodysetValueAt().
- pokud vrátí <code>true, pak bude buňka na řádku
-
void setValueAt(Object, row, col)naši třídu, že hodnota v buňce se změnila. Je na nás, abychom zařídili odpovídající úpravu našich dat.- touto metodou informuje <code>JTable
- Jak s třídou pracujeme
- Typicky vytváříme potomka této třídy.
- Náš potomek přidává jako atribut data, která se mají zobrazovat v tabulce.
- Například pro tabulku s údaji studentů ve třídě by mohla fungovat třída
TridaModel, která by byla potomkemAbstractTableModela jako atribut mělaArrayList<Student>, kdeStudentbude třída nesoucí informace o studentovi.
- Například pro tabulku s údaji studentů ve třídě by mohla fungovat třída
- Když
JTablechce zobrazit tabulku, vyžádá si data od modelu.- V našem příkladě zavolá metodu
getValueAttřídyTridaModelpostupně pro čísla řádku a sloupce (1,1), (2,1),... atd. Každým voláním zjistí hodnotu jedné buňky a vypíše ji.
- V našem příkladě zavolá metodu
- Pokud se uživatel pokusí do některé buňky zapsat,
JTablemu to povolí pouze, pokud mu metodaisCellEditablevrátítrue. - Pokud je zápis povolen, předá
JTabledata našemu modelu- Instance
JTabletedy zavolá metodusetValueAttřídyTridaModel. Na toto volání je třeba zareagovat tak, že se vyhledá v seznamu správný student (podle čísla řádku) a upraví se jeho údaje (podle čísla sloupce zjistíme, který údaj se změnil).
- Instance
- Pokud se změní data, je to třeba třídě JFrame sdělit
- K tomu stačí zavolat připravené metody, které zdědíme ze třídy
AbstractTableModel. -
void fireTableDataChanged()— obecná změna dat -
void fireTableRowsDeleted(int firstRow, int lastRow)— smazání daných řádků - a další...
javax.swing.JScrollPane
- Zajistí, aby se vykreslila jen část tabulky, pokud je tabulka moc veliká a nevleze se do okna.
- Pokud se tabulka nevleze do okna, zobrazí na okrajích okna posuvníky tak, abychom mohli zobrazit libovolnou část tabulky.
- Součásti
-
JViewPort- místo, kde se zobrazují data
- může zobrazit hlavičku řádku či sloupce —
setColumnHeaderView,setRowHeaderView
-
JScrollBar— posuvníky- mohou a nemusí být zobrazeny
- standardně se zobrazují jen pokud je potřeba
- Použití pro zobrazení tabulky
JScrollPane scrollPane = new JScrollPane(table); panel.add(scrollPane);