táblázat elek tibor -...

31
Java felhasználói felület Táblázat Elek Tibor

Upload: hoangquynh

Post on 10-Apr-2018

236 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

Java felhasználói

felület

Táblázat

Elek Tibor

Page 2: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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

Page 3: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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.

Page 4: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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

Page 5: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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

Page 6: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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.

Page 7: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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];

}

}

Page 8: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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});

Page 9: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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; }

Page 10: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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);

}}

Page 11: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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

Page 12: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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”);

Page 13: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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())

Page 14: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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));

}

}

Page 15: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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());

Page 16: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

JTable

TableCellRenderer

Saját renderer TableCellRenderer-ből:

lásd. Swing tutorial példák

lásd példák editornál

Page 17: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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));

Page 18: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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ó

Page 19: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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;

}

Page 20: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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(); }

}

}

Page 21: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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

Page 22: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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);

Page 23: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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));

Page 24: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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!)

Page 25: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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()

Page 26: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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)

Page 27: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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.

Page 28: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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()

Page 29: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

JTable

EgyebekAdat: get(set)ValueAt()

Kinézet: get(set)ShowGrid, ShowHorizontalLines,

ShowVerticalLines, GridColor

RowHeight, RowMargin

Scrollozás:JScrollPane-be kell rakni

Page 30: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

Példa

Page 31: Táblázat Elek Tibor - users.iit.uni-miskolc.huusers.iit.uni-miskolc.hu/.../felh_fel_jegyzet/007JavaGUI_JTable.pdf · Java felhasználói felület Táblázat Elek Tibor. JTable

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.