táblázat elek tibor -...
TRANSCRIPT
Java felhasználói
felület
Táblázat
Elek Tibor
JTable
Szerep: táblázatos adatok megjelenítése,
szerkesztése
Fogalmak:
- Adatmodell (TableModel): szolgáltatja az
adatokat és változásait, illetve az adatok típusait
- Oszlop (TableColumn): egy oszlop jellemzőit
tartalmazza (modell oszlopindex, fejléc
információk, szélesség, renderer, editor, stb.)
- Renderer (TableCellRenderer): szolgáltatja az
adott cella megjelenítését. Típusokhoz
megadható.
JTable
Fogalmak:
- Editor (TableCellEditor): cella editálásakor
megjelenő editor. Típusokhoz megadható.
- Rendező (RowSorter): Egy oszlop
összehasonlító algoritmusát tartalmazza.
- Kiválasztás modell: Az adat (sor, oszlop)
kiválasztási módot írja le.
JTable
Szolgáltatások:
- DefaultTableModel generálása (csak Object
adatokhoz érdemes)
- DefaultCellRenderer az egyes típusokhoz
(boolean, szám, Object)
- DefaultCellEditor az egyes típusokhoz (boolean,
szám, String)
- RowSorter-ek automatikus generálása
- DefaultSelectionModel
JTable
TableModelAbstractTableModel:
addTableModelListener(): Modell (adatok)
változásaigetColumnClass(): egy adat típusát adja.
Fontos felüldefiniálni!getValueAt(): egy adott sor, oszlop adatát
adjasetValueAt(): adatot beállítja
isCellEditable(): editálható-e a cella
JTable
TableModelDefaultTableModel:
Az adatok tárolását Vector-ral oldja meg.
Oszlopok típusaként Object-et ad.
(Leszármaztatás, getColumnClass()
felüldefiniálás.)
Funkciói: sor, oszlop hozzáadás, törlés,
lekérdezés, stb. Pl.
addRow(Object[]), addRow(Vector),
addColumn(String), stb.
JTable
TableModelDefaultTableModel használat:definiálás pl.:private class SajatTableModel extends
DefaultTableModel {
private Class[] oszlopTip = new Class[]
{ String.class, Integer.class };
public SajTableModel(Object[] columnNames,
int rowCount) {
super(columnNames, rowCount);
}
@Override
public Class<?> getColumnClass(int
columnIndex) {
return oszlopTipusok[columnIndex];
}
}
JTable
TableModelDefaultTableModel használat:
létrehozás, hozzárendelés:Object[] oszlopok = new Object[] {”Név”,
”Kor”};
SajatTableModel stm = new
SajatTableModel(oszlopok, 0);
this.jTable1.setModel(stm);
Sorok hozzáadása:stm.addRow(new Object[] {”Béla”, 24});
JTable TableModel
Egy másik tablemodel példa:private class SajatTableModel extends AbstractTableModel {
private String[] oszlopNevek = new String[] { "Név", "Kor", "Születési dátum" };
private Class[] oszlopTipusok = new Class[] { String.class, Integer.class, Date.class };
private ArrayList<Szemely> szemelyek;public SajatTableModel() {
this.szemelyek = new ArrayList<Szemely>(); }public ArrayList<Szemely> getSzemelyek() {
return szemelyek; }public Class<?> getColumnClass(int columnIndex) {
return oszlopTipusok[columnIndex]; }public int getRowCount() {
return this.szemelyek.size(); }public int getColumnCount() {
return this.oszlopNevek.length; }public String getColumnName(int column) {
return this.oszlopNevek[column]; }public boolean isCellEditable(int rowIndex, int
columnIndex) { return true; }
JTable TableModel
Egy másik tablemodel példa folytatás:public Object getValueAt(int rowIndex, int
columnIndex) {if (columnIndex == 0)
return this.szemelyek.get(rowIndex).getNev();if (columnIndex == 1)
return this.szemelyek.get(rowIndex).getKor();if (columnIndex == 2)
return this.szemelyek.get(rowIndex).getSzul();return new Object();
}public void setValueAt(Object aValue, int rowIndex,
int columnIndex) {if (columnIndex == 0)
this.szemelyek.get(rowIndex).setNev((String)aValue);if (columnIndex == 1)
this.szemelyek.get(rowIndex).setKor((Integer)aValue);if (columnIndex == 2)
this.szemelyek.get(rowIndex).setSzul((Date)aValue);fireTableRowsUpdated(rowIndex, columnIndex);
}}
JTable
Oszlopok
Automatikus generálás:setAutoCreateColumnsFromModel(boolean)
Oszlop modell:addColumn(), removeColumn()!!!
getColumn(), moveColumn()
Oszlop műveletek: get(set)HeaderValue, MinWidth, MaxWidth,
PreferredWidth, ModelIndex,
HeaderRenderer, CellRenderer,
CellEditor
JTable
Oszlopok- Az oszlopok bővítésére, törlésére az adatmodellnek is fel kell készülni. (A példa adatmodell esetén nem szabad változtatni az oszlopokat.)- Oszlopok elrejtése funkció nem létezik. Megoldása oszlopok törlésével, hozzáadásával.
- Példa: 2. oszlop szélesség, felirat beállításTableColumn a =
jTable1.getColumnModel().getColumn(1);
oszlopszélesség: a.setPreferredWidth(150);fejléc: a.setHeaderValue(”Életkor”);
JTable
TableCellRenderer
DefaultTableCellRenderer:
- Boolean: checkbox
- Number: label, jobbra igazított tartalom,
NumberFormat.getXXXInstance()-tal formázva
- Date: label, jobbra igazítva,
DateFormat.getDateInstance(DateFormat.SHOR
T)-al formázva
- ImageIcon: label, középre igazítva
- egyéb: label, balra igazítva (a tartalom
toString())
JTable
TableCellRendererSaját renderer a Defaultból példa short dateformat
helyett long:private class DateRenderer extends
DefaultTableCellRenderer {
DateFormat formatter;
protected void setValue(Object value) {
if (this.formatter == null)
this.formatter =
DateFormat.getDateInstance(DateFormat.LONG);
this.setText(value == null ? "" :
this.formatter.format(value));
}
}
JTable
TableCellRenderer
Saját renderer a Defaultból példa short
dateformat helyett long folytatás:
Használat: jTable1.setDefaultCellRenderer(Date.class, new
DateRenderer());
vagyTableColumn a =
jTable1.getColumnModel().getColumn(2);
a.setCellRenderer(new DateRenderer());
JTable
TableCellRenderer
Saját renderer TableCellRenderer-ből:
lásd. Swing tutorial példák
lásd példák editornál
JTable
Cella editálás
DefaultCellEditor
- Boolean: JCheckBox
- Number: JFormattedTextField
- Egyéb: JTextField
Saját editorral megtöltött Default:
Három konstruktor: JCheckBox, JComboBox,
JTextFieldJComboBox cmb = new JComboBox();
cmb.addItem("Egyik");
cmb.addItem("Másik");
egyikColumn.setCellEditor(new
DefaultCellEditor(cmb));
JTable
Cella editálás
Saját editor az AbstractCellEditor-ból:
felüldefiniálandó metódusok:
Component getTableCellEditorComponent() :
visszaadja a belső editor-t.
Object getCellEditorValue() : editálás végén
visszaadja az értéket
isCellEditable(EventObject evt) : editálás
feltétele (pl. hány klikkre)
boolean stopCellEditing() : meghívódik mielőtt
befejeződne az editálás, pl. validálásra
használható
JTable
Cella editálás
Saját editor az AbstractCellEditor-ból:
Példa: JSpinner cell editorkéntprivate class SpinnerEditor extends
AbstractCellEditor implements TableCellEditor {
final JSpinner spinner = new JSpinner();
public SpinnerEditor() {
spinner.setModel(new SpinnerDateModel());
}
public Component getTableCellEditorComponent(
JTable table, Object value, boolean
isSelected, int row, int column) {
spinner.setValue(value);
return spinner;
}
JTable
Cella editálás
Saját editor az AbstractCellEditor-ból:
Példa: JSpinner cell editorként folytatáspublic boolean isCellEditable(EventObject evt) {
if (evt instanceof MouseEvent) {
return ((MouseEvent)evt).getClickCount() >= 2;
}
return true;
}
public Object getCellEditorValue() {
return spinner.getValue(); }
}
}
JTable
Rendezés
table.setAutoCreateRowSorter(true);
minden oszlopra az alapértelmezett Comparator-
ral
TableRowSorter funkciók: get(set), is(set)
Comparator : egy java.util.Comparator,
Sortable : rendezhető-e,
SortKeys : a jelenlegi rendezés,
MaxSortKeys: hány oszlop szerint lehet rendezve
JTable
RendezésPélda:jTable1.setAutoCreateRowSorter(true);
Sorter lekérdezése:TableRowSorter<TableModel> so =
(TableRowSorter<TableModel>)jTable1.getRowSort
er();
A 0. oszlop szerinti rendezés letíltása:so.setSortable(0, false);
Saját comparator az 1. oszlophoz:so.setComparator(1, new SajatComparator());
Rendezés beállítása kódból (2. oszlop növekvő):ArrayList <RowSorter.SortKey> keys =
new ArrayList<RowSorter.SortKey>();
keys.add(new RowSorter.SortKey(2,
SortOrder.ASCENDING));
so.setSortKeys(sortKeys);
JTable
Szűrés
A rendezőnek megadható szűrési feltétel is.
Létező Filter-ek:dateFilter, numberFilter, regexFilter:
dátumra, számra, szövegreandFilter, orFilter, notFilter: több filter
összekapcsolása
Pl. az 1. vagy 3. oszlopban „al”-t tartalmazso.setRowFilter(
RowFilter.regexFilter(".*al.*",0,2));
a második oszlopban 20-nál kisebb:so.setRowFilter(RowFilter.numberFilter(
RowFilter.ComparisonType.BEFORE, 20, 1));
JTable
Kiválasztás
Sor, oszlop, cellatartomány kiválasztás.
DefaultListSelectionModel-t használ. (lásd JList.)
DefaultListSelectionModel beállítása:setSelectionMode(): egy, folytonos, több
kiválasztássetXXXSelectionAllowed() : Cell, Column,
Row kiválaszthatóság (egymást befolyásoló lehetőségek!)
JTable
Kiválasztás
Kiválasztás kezelése:XXX: Row, Columnint getSelectedXXX(),
int getSelectedXXXCount(),
int[] getSelectedXXXs(),
boolean isCellSelected(int row, int col),
boolean isXXXSelected(int index),
void addXXXSelectionInterval(int tol, int ig),
void setXXXSelectionInterval(int tol, int ig),
void changeSelection(int row, int col, boolean
toggle, boolean extend),
void clearSelection(),
void selectAll()
JTable
Model vs View
Fontos: A táblázat kezelő metódusai a view sor,
oszlop, cella sorszámát használják nem a
modellbeli sorszámát!!
Rendezéskor, szűréskor, oszlopmozgatáskor a
kettő eltér egymástól!!
Az egyikből a másikba:int convertXXXIndexToModel(int viewindex)
int convertXXXIndexToView(int modelindex)
JTable
Model vs View
Például a táblázat get(set)ValueAt() metódusa a
view indexeket használja, a modell
get(set)ValueAt() metódusa a modell indexeket.
Például a getSelectedXXX() metódus a view sorszámot adja vissza.
JTable
Gyakran használt események
- Adat modell változások: a model metódusával getModel().addTableModelListener()
- Kiválasztás változások:
a selection modellek metódusaivalgetSelectionModel().addListSelectionListener()
és az oszlop kiválasztásragetColumnModel().getSelectionModel().addListSe
lectionListener()
JTable
EgyebekAdat: get(set)ValueAt()
Kinézet: get(set)ShowGrid, ShowHorizontalLines,
ShowVerticalLines, GridColor
RowHeight, RowMargin
Scrollozás:JScrollPane-be kell rakni
Példa
Gyakorlat
Készítsen egy űrlapot, amelyben egy táblázatban
lehet könyv író, cím, stílus, oldalszám, ár adatokat
megjeleníteni, módosítani, újat felvinni, törölni.
Használjon DefaultTableModel leszármazottat.
A stílus megadásához készítsen egy combobox-t
celleditorként.
Az ár megjelenítéshez egy cell renderer-t, amely az
alapértelmezett pénz formátumban jeleníti meg az
árat.