• Nem Talált Eredményt

A kiválasztási modell

In document Programozási technológiák – Jegyzet (Pldal 166-171)

A szerződés alapú tervezés alapelvei

A szerződés

1. Swing felületek felépítése

1.3. Listák és legördülő listák

1.3.1. A kiválasztási modell

categories.add("" + cols.get(0));

}

categoryListModel = new javax.swing.AbstractListModel() { @Override

public int getSize() { return categories.size(); }

@Override

public Object getElementAt(int i) { return categories.get(i); } };

jList2.setModel(categoryListModel);

A következő kódrészletben a legördülő listának egy alapértelmezett modellt adunk át, amely az általunk beállított értékeket tartalmazza.

jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"ÜGYFÉL",

"ADMINISZTRÁTOR", "VEZETŐ"}));

1.3.1. A kiválasztási modell

A listák és legördülő listák egy ListSelectionModel objektumot használnak elemeik kiválasztásának módjához. Három kiválasztási mód lehetséges:

1.3.1.1. Egyszeres kiválasztás

7.4. ábra - Egyszeres kiválasztás

Egy időben csak egy listaelem választható ki. Ha a felhasználó egy másik elemet jelöl ki, az előző automatikusan deszelektálódik.

1.3.1.2. Egyszeres intervallum kiválasztás

7.5. ábra - Egyszeres intervallum kiválasztás

Grafikus felhasználói felületek készítése

Több, egymást közvetlenül követő elem kiválasztása. Amikor a felhasználó egy új intervallumot választ, az előzőleg kijelölt elemek deszelektálódnak.

1.3.1.3. Többszörös intervallum kiválasztás

7.6. ábra - Többszörös intervallum kiválasztás

Ez az alapértelmezett kiválasztási mód. Az elemek bármely kombinációja választható. A felhasználó maga deszelektálja az elemeket, ha szükséges.

A kiválasztási modellt a setSelectionMode metódus segítségével állíthatjuk be egy lista komponensen. A lista kiválasztási modellt táblázatobjektumokra is alkalmazhatjuk.

Egyszeres kiválasztási mód beállítása.

jList2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

...

jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

1.3.2. Eseménykezelők

7.7. ábra - Eseménykezelők [SwingTutorial]

Grafikus felhasználói felületek készítése

A Swing eseménymodellje hatékony és rugalmas. Bármely eseménytípust tetszőlegesen sok forrásból felismerhet több eseményfigyelő objektum (event listener). Egy esemény figyelésére egy objektum is beállítható, de egy listener objektum minden forrás minden eseményét is figyelheti, valamint egy esemény figyelésére egyetlen forrásból több listener objektum is ügyelhet.

Minden esemény egy objektum, amely információkat tartalmaz az eseményről és az esemény forrásobjektumáról. Az események forrása legtöbbször komponens vagy modell, de bármely objektumtípus funkcionálhat eseményforrásként.

A Swing az eseményeket csoportosítja is: beszél alacsony szintű és szemantikus eseményekről. Az alacsony szintű események főként az ablakozó rendszer eseményei, mint amilyenek például a közvetlenül a felhasználótól érkező billentyűzet- és egéresemények. A szemantikus események ezeknél magasabb szintűek, és felhasználói bemenet váltja ki: például rákattint egy gombra. Jellemző, hogy egy szemantikus esemény mögött alacsony szintű események egész sorozata húzódik meg: egy gombnyomáshoz, mint szemantikus eseményhez az egérkurzor pozícionálására, az egérgomb lenyomására és felengedésére is szükség van (ezek mind alacsony szintű műveletek). Ráadásul ugyanazt a szemantikus eseményt több alacsony szintű eseménysoorozattal is elérhetjük, hiszen a gombnyomás szemantikus esemény pusztán a billentyűzet segítségével is kiváltható: a TAB billentyűvel kiválasztva a gombot a szóköz illetve az Enter billentyű lenyomásával.

A szemantikus eseményeket négy osztály reprezentálja:

• az ActionEvent, amely ezek közül a leggyakoribb, gombnyomáskor, menüválasztáskor, listaelem-kiválasztáskor, illetve a szövegmezőn Enter leütésekor keletkezik ilyen esemény;

• az AdjustmentEvent, amely egy görgetősáv (scroll bar) használata során következik be;

• az ItemEvent akkor áll elő, ha a felhasználó jelölőnégyzetek segítségével vagy listaelemekből kiválaszt valamit;

• míg végül a TextEvent akkor jön létre, ha egy szövegmező vagy szövegterület tartalma megváltozik.

Az alacsony szintű események osztályai az alábbiak:

ComponentEvent, amely amellett, hogy komponensek átméretezése, mozgatása, megjelenítése illetve elrejtése során következik be, az összes alacsony szintű esemény ősosztálya is;

KeyEvent, amely egy billentyű lenyomása és felengedése esetén generálódik;

MouseEvent, amely az egérkurzor mozgatása, az egyes egérgombok lenyomása és felengedése, és vonszolás során jön létre;

FocusEvent, amelynek a segítségével arról értesülhhetünk, ha egy komponens megkapta vagy éppen elvesztette a fókuszt;

WindowEvent, akkor generálódik, ha egy ablakot aktiváltak, deaktiváltak, ikon állapotúra kicsinyítettek, ikon állapotúról felnagyították, vegy éppen bezárták; és végül

ContainerEvent, ami egy-egy komponens konténerhez adásakor vagy onnan való törlésekor jön létre.

Ha csak lehet, a szemantikus eseményekre kell feliratkoznunk, nem pedig az alacsony szintűekre. Ennek több előnye is van: egyrészt így tudjuk a kódunkat a leginkább hordozhatóvá és robusztussá tenni, másrészt pedig így

Grafikus felhasználói felületek készítése

akkor is értesülünk egy eseményről (például egy nyomógombra kattintásról), ha azt nem az elvárt módon végezték. Egy nyomógomb megnyomását például csak egérrel érhetjük el, hanem a billentyűzettel is. Ha ekkor a szemantikus esemény helyett csupán arra iratkoztunk volna fel, hogy egy adott területen (ahol a gomb van) történik-e kattintás és felengedés egérgomb segítségével, akkor a billentyűzet segítségével végzett

„gombnyomásról” bizony lemaradnánk.

A következő táblázat a komponensek és a hozzájuk rendelhető figyelő objektumok típusát tartalmazza.

7.1. táblázat - Komponensek és figyelőik [SwingTutorial]

Kompone

Egy tevékenységfigyelő (action listener) implementálásával megadhatjuk, hogy mi történjen, ha a felhasználó egy bizonyos tevékenységet végez. A felhasználó által végzett tevékenység lehet például egy gomb megnyomása, egy listaelem kiválasztása, vagy az Enter billentyű megnyomása egy szövegmezőn. Mindennek az az eredménye, hogy egy actionPerformed üzenet kerül elküldésre minden olyan tevékenységfigyelő objektumnak, amely fel van iratkozva az esemény forráskomponensére.

Egy tevékenységfigyelő implementálása a következő lépésekből áll:

1. Egy eseménykezelő osztály deklarálása, amely implementálja az ActionListener interfészt.

public class MyActionListener implements ActionListener { ...

}

2. Az interfész actionPerformed metódusának implementálása. A példában a kombóbox segítségével kiválasztott elemet (egy szerepkört) a currentRole nevű változónak adjuk értékül.

public void actionPerformed(java.awt.event.ActionEvent evt) {

Grafikus felhasználói felületek készítése

currentRole = (String) jComboBox1.getSelectedItem();

}

Megjegyzés

Amennyiben az eseménykezelőt több eseményforráshoz is csatoljuk (regisztráljuk), és szeretnénk attól függő feldolgozást végezni, hogy melyik volt az az eseményforrás, amelyen az esemény ténylegesen bekövetkezett és amely miatt az eseménykezelő aktivizálódott, akkor az ActionEvent objektumból tudjuk mindezt kinyerni, ahogyan a fenti példa is mutatja (evt.getSource()). Erre általában nincs szükségünk, mert sokszor vagy csak egy eseményforrással dolgozunk, vagy ha több is van belőlük, nem feltétlenül van szükség forrásfüggő feldolgozásra. Ekkor a paramétert gyakorlatilag figyelmen kívül hagyjuk.

3. Az osztály egy példányának egy vagy több komponens figyelésére történő feliratkoztatása. Ez tulajdonképpen nem más, mint a Megfigyelő (Observer) minta megjelenése, amikor a megfigyelő (ez esetben a MyActionListener példány) regisztrálja magát a megfigyeltnél (ez a jComboBox1 változónévvel hivatkozott kombóbox).

jComboBox1.addActionListener(new MyActionListener());

Ezt követően, ha a felhasználó elvégez egy bizonyos tevékenységet, a komponens elindít egy tevékenységeseményt. Ez az ActionListener interfészt megvalósító objektum actionPerformed metódusának meghívását eredményezi. A metódus egyetlen paramétere egy ActionEvent objektum, amely információt adhat az eseményről és annak forráskomponenséről.

Megjegyzés

A tevékenységfigyelőt gyakran névtelen osztályként valósítjuk meg. Különösen így van ez akkor, ha csak egyetlen felületelemhez tartozik az eseménykezelő, hiszen akkor elég csak egyetlen helyen, a megfigyeltnél történő regisztációkor (addActionListener hívás) hivatkozni.

1.4. Táblázatok

7.8. ábra - Táblázat beágyazott ComboBox objektumokkal

A JTable osztály objektumainak segítségével táblázatos adatokat tudunk megjeleníteni és kezelni. A táblázatok oszlopokból és sorokból állnak, amelyeknek metszetében a cella található. A táblázat adatait a kódban egy kétdimenziós objektumtömbként vagy Vector-ok Vector-aként adhatjuk meg (adatok paraméter).

Object[][] adatok = {...};

Object[] oszlopnevek = {...};

JTable tablazat = new JTable(adatok, oszlopnevek);

Első konstruktor:

public JTable(Object[][] adatok, Object[] oszlopnevek);

Második konstruktor:

Grafikus felhasználói felületek készítése

public JTable(Vector adatok, Vector oszlopnevek);

Egy táblázat objektum sorain és oszlopain szűrési és rendezési műveleteket is végezhetünk, amelyekhez saját implementációt adhatunk.

In document Programozási technológiák – Jegyzet (Pldal 166-171)