Java felhasználói felület Listák. Egyebek Elek Tibor
JList Szerep: Egy vagy több elem kiválasztása véges számú (2-100) elemből. Fontosabb tudnivalók: - Lista elemek kezelése: ListModel - Kiválasztás kezelése: SelectionModel - Elem megjelenítés kezelése: CellRenderer - Lista elemek elrendezése, scrollozás
JList Lista elemek kezelése ListModel interface-t implementáló osztály. Létezik - nem módosítható (nem lehet új elem, elem törlése, lecserélése) - módosítható (lehet új elem, stb.) Model létrehozása: 1. JList konstruktor JList(Object[] ): létrejön egy nem módosítható JList(Vector<> ): létrejön egy nem módosítható
JList Lista elemek kezelése Model létrehozása: 2. DefaultListModel használata: módosítható DefaultListModel a = new DefaultListModel(); JList lst = new JList(a); vagy JList lst = new JList(); lst.setmodel(a); 3. saját model létrehozása: Implementálva a ListModel interface-t vagy leszármaztatva az AbstractListModel-ből vagy DefaultListModel-ből.
JList Lista elemek kezelése ListModel funkciói: Object getelementat(int index) int getsize() void addlistdatalistener(listdatalistener l) DefaultListModel funkciói: (mint Vector) get, add, addelement, remove, set, indexof, stb.
JList Kiválasztás kezelése ListSelectionModel interface: Lehetséges: - Egy elem kiválasztás - Egy folytonos tartomány kiválasztás - Több tartomány kiválasztás Műveletei: Kiválasztási mód beállítása, lekérdezése, kiválasztott elemek lekérdezése, indexeinek lekérdezése, kiválasztás egyet, kiválasztás többet, kiválasztás változás eseményfigyelő bejegyzése. A műveletek többsége elérhető JList-ből is.
JList Kiválasztás kezelése Létrehozás: - DefaultListSelectionModel használata: alapból ezt használja. - Saját model létrehozása, majd setselectionmodel(listselectionmodel )
JList Kiválasztás kezelése JList-ből elérhető funkciók: get(set)selectedindex(), get(set)selectedvalue(), get(set)selectedindices(), isselectedindex(), clearselection(), isselectionempty(), addlistselectionlistener(), stb.
JList Elem megjelenítés kezelése: CellRenderer Az elemek megjelenítéséhez a ListCellRenderer interface egy implementációját használja. 1. DefaultListCellRenderer az alapértelmezett: - egy JLabel leszármazott - tudja szöveg, kép lista elem megjelenítését, a többihez az objektum tostring()-jét használja. - lehetséges lekérdezni és beállítani DefaultListCellRenderer cr = (DefaultListCellRenderer)lstFix2.getCellRenderer(); cr.sethorizontalalignment(jlabel.right);
JList Elem megjelenítés kezelése: CellRenderer 2. Saját: Implementálni a ListCellRenderer-t. Például: sorszámozott elemek és más kijelölt szín private class MyCellRenderer extends JLabel implements ListCellRenderer { public MyCellRenderer() { setopaque(true);} public Component getlistcellrenderercomponent( JList list, Object value, int index, boolean isselected, boolean cellhasfocus) { String szoveg = index + : + value.tostring(); settext(szoveg); Color foreground; if (isselected) { foreground = Color.YELLOW;} else { foreground = Color.BLACK;}; setforeground(foreground); return this; }}
JList Lista elemek elrendezése, scrollozás get(set)layoutorientation() get(set)visiblerowcount() Scrollozáshoz JScrollPane! ensureindexisvisible()
JList Példa - lista String[] elemekkel, scrollpane nélkül - lista String[] elemekkel scrollpane-ben, a DefaultCellRenderer beállításával, kijelölés változás figyeléssel - lista elem hozzáadás, törlés - lista Szemely listaelemekkel, DefaultListCellRenderer-el - lista Szemely listaelemekkel, saját CellRenderer-el
JComboBox Szerep: Helytakarékos egy kiválasztásos JList vagy helytakarékos egykiválasztásos JList plussz JTextField Fontosak: - Model - CellRenderer - Editor
JComboBox Model: data + selection modell együtt 1. ComboBoxModel: ListModel leszármazott get(set)selecteditem() 2. MutableComboBoxModel: ComboBoxModel leszármazott. (addelement(), insertelementat(), removeelement(), removeelementat()) 3. DefaultComboBoxModel: MutableComboBoxModel implementáció JComboBox-ból elérhető modell funkciók: additem, removeitem, getitemat, stb.
JComboBox CellRenderer: Ua. mint JList Események: additemlistener() : kijelölt elem megváltozásakor, két ItemEvent: deselect, select addactionlistener() : kijelölt elem megváltozásával, valamint editálás befejeztével
JComboBox Editor rész: Megjelenítés, szerkesztés. Csak akkor használja, ha a ComboBox editable get(set)editable(): alapból false 1. BasicComboBoxEditor: JTextField-et használ. - a text mező lekérdezhető és beállítható 2. Saját: - leszármaztatni a BasicComboBoxEditor-ból (csak akkor célszerű, ha JTextField leszármazott editor-t akarok), - implementálni a ComboBoxEditor interface-t
JComboBox Példa: - Editálható combo, action és item eseményekkel - Editálható combo, az editort lekérdezve és hozzáadva egy DocumentFilter-t - Editálható combo, az editor saját BasicComboBoxEditor leszármazott - Editálható combo, saját JFormattedTextField-et használó editorral
JSpinner Szerep: A JComboBox-hoz nagyon hasonló, csak nem legördíthető. Azaz kiválasztás elemekből vagy szerkesztés. Adatmodellek: saját vagy SpinnerNumberModel: nem felsorolt elemek, hanem min, max, lépés, aktuális érték SpinnerDateModel: nem felsorolt elemek, hanem start, end, lépésmező, aktuális érték SpinnerListModel: felsorolt elemek (Object[] vagy List<>)
JSpinner Editor rész: saját vagy DefaultEditor: egy egyszerű általános megvalósítás, JFormattedTextField-et használ, de nem editálható NumberEditor: SpinnerNumberModel esetén, JFormattedTextField a megadott DecimalFormat-tal DateEditor: SpinnerDateModel esetén, JFormattedTextField a megadott SimpleDateFormat-tal ListEditor: SpinnerListModel esetén, JFormattedTextField
JSlider Szerep: Numerikus érték megadása csúszkán Modell: BoundedRangeModel, DefaultBoundedRangeModel Főbb funkciók: get(set)value() get(set)minimum(), get(set)maximum() get(set)extent() Események: addchangelistener() get(set)valueisadjusting(): Slider húzás több esemény-e
JSlider Főbb funkciók: Kinézet: get(set)orientation(), get(set)inverted() Vonalkázás: get(set)paintticks(), get(set)minortickspacing(), get(set)majortickspaceing() Feliratozás: get(set)paintlabels(), get(set)labeltable(),(hashtable) createstandardlabels()
Gyakorlat Hozzunk létre egy űrlapot, amelyen van egy lista egy text mező és két gomb. Az egyik gomb hatására a lista elemekhez hozzáadja a text mező tartalmát. A másik gomb hatására kitörli a listából a kijelölt elemeket. Legyen még két gomb, amellyel mozgathatjuk az első kijelölt elemet a listában le, fel. Változtassuk meg a cellrenderer beállításait úgy, hogy jobbra igazítson.
Gyakorlat Rakjon ki egy módosítható JComboBox-t tetszőleges elemekkel és egy textarea-t. Készítsen egy item eseménykezelőt, amely a textarea-ba írja at esemény adatait: item esemény: itemnév Selected Deselected alakban Készítsen egy action eseménykezelőt, amely a textarea-ba írja az esemény adatait action esemény: kiválasztottitem Figyelje meg milyen események keletkeznek elem kiválasztásakor, új elem begépelésekor, illetve a kiválasztott elem kódból történő megváltoztatásakor (egy gomb amelynek hatására megváltoztatja a kiválasztott elemet).
Gyakorlat Készítsen egy űrlapot, amelyen egy árú nevét, darabszámát (JSpinner), lejárati dátumát (JSpinner), Valami (JSlider, 10-20 közötti egész szám) lehet megadni. Legyen egy gomb, amelynek hatására a kitöltött adatokat kiírja a konzolra.
JTree Szerep: Hierarchikus adatok kijelzése, kezelése (pl. fastruktúra, szervezeti egység struktúra) Adat modell TreeModel interface: csomópontok Object-ek root elem lekérdezés, egy szülő gyerekeinek lekérdezése, változás figyelő DefaultTreeModel: csomópontok TreeNode-ok
JTree Csomópontok: TreeNode interface: szülö, gyerekeklistája, egy adott gyerek, gyerekek száma, stb. MutableTreeNode interface: gyermek beszúrás, törlés, áthelyezés, UserObject DefaultMutableTreeNode: pl. szülő, gyermek, testvér, útvonal kezelés, UserObject Konstruktor param: UserObject, lehet-e gyereke
JTree DefaultTreeModel használata 1. root node létrehozása DefaultMutableTreeNode root = new DefaultMutableTreeNode( Egységek ); 2. Gyerekei és azok gyerekei létrehozás gy1 = new DefaultMutableTreeNode(new Egyseg( gyar1, EgysegFajta.GYAR)); u1 = new DefaultMutableTreeNode(new Egyseg( uzem1, EgysegFajta.UZEM)); gy1.add(u1); u2 = new DefaultMutableTreeNode(new Egyseg( uzem2, EgysegFajta.UZEM)); gy1.add(u2); root.add(gy1);
JTree DefaultTreeModel használata 3. modell létrehozása és hozzárendelése JTree tree = new JTree(root); vagy DefaultTreeModel dtm = new DefaultTreeModel(root); JTree tree = new JTree(dtm); vagy DefaultTreeModel dtm = new DefaultTreeModel(root); JTree tree = new JTree(); tree.setmodel(dtm);
JTree JTree.DynamicUtilTreeNode Segéd osztály, amely legenerálja a csomópontokat egy gyűjteményből vagy tömbből. Hashtable<Object, Object> hashtable = new Hashtable<Object, Object>(); hashtable.put("a", new String[] { "a", "b" }); Hashtable<Object, Object> inner = new Hashtable<Object, Object>(); inner.put("i1", "i2"); inner.put("i2", new String[] {"i21", "i22"}); hashtable.put("b", inner); DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); JTree.DynamicUtilTreeNode.createChildren(root, hashtable);
JTree CellRenderer model TreeCellRenderer interface DefaultTreeCellRenderer: JLabel leszármazott, open icon, closed icon, leaf icon, background color, selection background color, text color, selection text color, font Alapból a userobject tostring-je a szöveg. Meglévő cell renderer beállítás: DefaultTreeCellRenderer dcr = (DefaultTreeCellRenderer)tre.getCellRenderer(); dcr.setbackgroundselectioncolor(color.magenta)
JTree CellEditor model: Az editor megjelenik, ha a JTree editable és tripla klikk a csomóponton. Ha nincs megadott CellEditor, akkor DefaultTreeCellEditor DefaultTreeCellEditor.DefaultTextField-el. TreeCellEditor interface DefaultCellEditor: checkbox, combobox, textfield DefaultTreeCellEditor: megadott TreeCellEditor-ral vagy saját default-tal.
JTree CellEditor példa: combobox editor 1. combobox létrehozása: String el[] = { "A", "B", "C", "D" }; JComboBox cmb = new JComboBox(el); cmb.seteditable(true); 2. editor létrehozása TreeCellEditor cmbed = new DefaultCellEditor(comboBox); 3. treecelleditor létrehozása változatlan rendererrel DefaultTreeCellRenderer renderer = DefaultTreeCellRenderer)tree.getCellRenderer(); DefaultTreeCellEditor editor = new DefaultTreeCellEditor(tree, renderer, cmbed);
JTree CellEditor példa: combobox editor 4. hozzárendelés a tree-hez tree.setcelleditor(editor); JTree editorral kapcsolatos funkciói: TreePath geteditingpath() void starteditingatpath(treepath) void stopediting() get(set)celleditor()
JTree TreePath Egy csomóponthoz vezető objektumokat reprezentálja. Funkciók: Object[] getpath(), TreePath getparentpath(), Object getpathcomponent(int index), Object getlastpathcomponent(), int getpathcount(), boolean isdescendant(treepath)
JTree Selection modell Csomópontok kiválasztási modell-je. TreeSelectionModel interface DefaultTreeSelectionModel: Lehetővé teszi egy kiválasztást, folytonos több kiválasztást, több kiválasztást. tree.getselectionmodel().setselectionmode( DefaultTreeSelectionModel.SINGLE_TREE_SELECTION);
JTree Selection modell A funkciók többsége megtalálható a JTree-ben is. Fontosabb funkciók: TreePath getselectionpath() void setselectionpath(treepath) TreePath[] getselectionpaths() void setselectionspaths(treepath[]) Object getlastselectedpathcomponent(): ua. mint getselectionpath().getlastpathcomponent() getleadselectionpath(): előzőleg kijelölt Illetve csak a JTree-ben: void addtreeselectionlistener(treeselectionlistener)
JTree Expand, collapse expandpath(), collapsepath(), scrollpathtovisible(), get(set)toggleclickcount(), addtreeexpansionlistener(), addtreewillexpandlistener()
JTree Kinézet: setrootvisible() setshowsroothandles() setscrollsonexpand() putclientproperty("jtree.linestyle", "Angled"); vagy Horizontal, vagy None
Gyakorlat Készítsen egy űrlapot, amelyen egy JTree és két gomb (felvitel, törlés). Felvitelkor a kiválasztott node alá kell felvenni egy új feliratú node-t. Törölni csak ha nincs gyereke. A kiválasztás módosulásakor állítsa a gombok engedélyezettségét, azaz legyen letiltva a törlés, ha van gyereke a kiválasztott node-nak, illetve legyen letiltva mind, ha nincs kiválasztva semmi.