Java programozási nyelv 2007-2008/ősz 4. óra
Eseménykezelés Java környezetben, AWT alapok Felhasználói felületek Eseménykezelés AWT ablakozó rendszer
[email protected]
[email protected]
Eseménykezelés, AWT alapok
Témakörök Felhasználói felületek AWT alapok Események kezelése NetBeans lehetőségei
http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
2
Felhasználói felület • Felhasználói felület: olyan, az alkalmazáshoz rendelt felület, amely megkönnyíti az ember-gép kommunikációt, segítségével – akár kis előképzettséggel is – a program könnyen kezelhető. Formái: – Karakteres: kis erőforrásigényű, viszont szegényes eszközkészletű – Grafikus („GUI”, graphical user interface): gazdag eszközkészletű, de több erőforrást is igényel
• MVC modell (Model-View-Controller modell): az adott alkalmazást három, jól elkülöníthető részként értelmező modell – Model: az alkalmazásban elvégzendő feladat modellje – View: a megjelenítést végző rész – Controller: a modell működése alapján ez vezérli (utasítja) a megjelenítő részt
http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
3
Eszközkönyvtárak • A Java nyelv két eszközkönyvtárat is elérhetővé tesz a felhasználói felületek kialakítására – AWT (Abstract Windowing Toolkit): jobban kötődik a hordozó operációs rendszerhez, annak eszközeit használja, gyors, kisszámú komponensből áll – SWING: gazdag komponenskészlet jellemzi, kevébé kötődik a hordozó operációs rendszerhez, Java-ban írták meg (lassabb működésű az AWT-nél) • Ezen eszközkészletek felhasználása mindig az adott alkalmazástól függ • Az eszközkészlet felhasználása során mindig figyelembe kell venni, hogy a program használata során milyen eszközkészlet lesz majd elérhető (JVM verzió)
http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
4
Komponensek • A felhasználó felületet komponensek alkotják, melyek lehetnek: – Hordozó típusú komponensek („konténerek”): képesek más hordozó, illetve hordozott komponenseket „viselni”, ilyenek lehetnek például az ablakok – Hordozott komponensek („komponensek”): megjelenítésükhöz és működtetésükhöz szükség van hordozó típusú komponensekre is, ilyenek lehetnek például a gombok, adatbeviteli mezők stb.
• A hordozó komponensek általában hordozottként is viselkednek, emiatt ezek egymásbaágyazhatók • A grafikus felhasználói felületű alkalmazás hierarchikus módon építhető fel, amely felépítés kiindulópontja mindig egy hordozó komponens, levélelemei pedig általában hordozott komponensek http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
5
GUI létrehozásának lépései • • • •
Alkalmazási kör meghatározása A szükséges komponsenek listájának összeállítása Az alkalmazható komponens hierarchia megtervezése, A komponensek összeállítása (a hordozott komponensek irányából – azaz a levélelemektől – haladunk a hierarchia kiindulóponja – azaz a gyökérelem – felé) • A komponensek viselkedését szabályozó eseménykezelőket a megfelelő komponsesekhez kötjük • Elinditjuk (megjeleníttetjük) a főablakot jelentő hordozó komponenst • A grafikus felületű programot általában üzenetvezérelt módon működtetjük. A program indítása után a vezérlés egy végtelenített ciklusba kerül, amely a felhasználótól érkező üzeneteket továbbítja a megfelelő komponensek felé (pl. egérkattintás esemény a gomb felé) http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
6
Eseménykezelés, AWT alapok
Témakörök Felhasználói felületek AWT alapok Események kezelése NetBeans lehetőségei
http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
7
AWT alapok • AWT eszközkészlet: jobban kötődik a hordozó operációs rendszerhez, viszont gyorsabb működésű a SWING-nél • Az AWT minden komponensének őse: java.awt.Component • Az AWT minden konténerének őse: java.awt.Container • A Container a Component osztály leszármazottja, ezek egymásbaágyazása tehát egyszerűen megoldható • A konténerek feladata a bennük található komponensek megjelenítése. Hogy pontosan milyen sorrendben és hol, ez nem (feltételnül) a más nyelvekben megszokott koordináták alapján történik, hanem tetszőleges ún. pakolási stratégiák szerint (ezek is objektumok, amik megvalósítják a LayoutManager interfészt) http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
8
AWT konténerek • Új komponensek felvétele/módosítása – public Component add(Component comp) Új komponens felvétele a komponens lista végére
– public Component add(Component comp, int index) Komponens felvétele megadott helyre
– public void add(Component comp, Object constraints) Komponens felvétele, a második paraméterben van lehetőség a pakolási stratégiától függő helymeghatározásra
– public void remove(Component comp) Megadott komponens törlése a listából
– public void validate() Módosítás esetén a komponensek újrarendszerezése
• Komponensek listájának lekérdezése – public Component[] getComponents() http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
9
Alapvető (gyári) pakolási stratégiák • Pakolási stratégia kiválasztása: – public void setLayout(LayoutManager mgr) • FlowLayout .add(komp); Egymás mellé pakolja a vezérlőket, amíg lehet, majd a következő sorba • BorderLayout N .add(komp, ”North”); Az égtáj szerint megadott területet W C E kitölti a komponens. S • Egyéb: CardLayout, GridLayout stb. • Layout manager nélkül: paraméterként null-t átadva nincs pakolási stratégia (abszolút koordináták) • Az elhelyezett komponensek természetesen lehetnek panelek is egy másik elhelyezési stratégiával http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
10
AWT konténer implementációk • java.awt.Panel Legegyszerűbb konténer, tartalmazza és megjeleníti a tartalmazott komponenseket • java.awt.Applet Panel leszármazottja, weboldalba ágyazható • java.awt.ScrollPane Panel leszármazott, amennyiben az általa tartalmazott konténereket nem tudja kirajzolni egyszerre, automatikusan megjeleníti a szükséges gördítősávokat • java.awt.Window Panel leszármazott, önmagában működőképes ablak • java.awt.Frame Ablak leszármazottja, fejléccel/kerettel kiegészítve • java.awt.Dialog Ablak leszármazott, fejléc/keret egyszerűbb adatbevitelre http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
11
Egyszerű konténer példa Példa egy Frame létrehozására két komponenssel: import java.awt.*; public class Main { public static void main(String[] main args) { Frame fr = new Frame(); fr.setLayout setLayout(new FlowLayout()); setLayout fr.setBounds setBounds(100, 10, 300, 300); setBounds Button btn = new Button("Lenyom"); "South"); fr.add add(btn, add TextField tx = new TextField(); fr.add add(tx, "North"); add fr.setVisible setVisible(true); setVisible } }
Próbáljunk ki más elrendezési stratégiákat is http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
12
AWT hordozott komponensek • Hordozott komponensek általános tulajdonságai – public void setName(String name) – public Container getParent() – public void setBounds(int x, int y, int width, int height) – public void paint(Graphics g) – public void setFocusable(boolean focusable) – public boolean isFocusOwner() – public void add(PopupMenu popup) – Eseménykezelők feliratkozása: add...Listener(...) – Eseménykezelők leiratkozása: remove...Listener(...)
• Érdemes megjegyezni, hogy a konténerek is a Component osztály leszármazottai, tehát ugyanazokkal a tulajdonságokkal rendelkeznek http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
13
AWT hordozott komponensek • Button: egyszerű nyomógomb – public Button(String label) – public void setLabel(String label) – public String getLabel() • Label: nem módosítható szöveg megjelenítése – public Label(String text) – public void setText(String text) – public String getText() • Canvas: téglalap alakú terület, amelyre közvetlenül rajzolni lehet – public void paint(Graphics g) Ilyenkor célszerű ezt a metódust felülbírálni http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
14
AWT hordozott komponensek • Checkbox: logikai érték kiválasztására szolgál – public Checkbox(String label) – public Checkbox(String label, boolean state) – public Checkbox(String label, boolean state, CheckboxGroup grp) – public void setLabel(String label) – public String getLabel() – public void setState(boolean state) – public boolean getState() • CheckboxGroup: segítségével lehetőség van Checkbox komponensek (kizáró) csoportban való kezelésére – public Checkbox getSelectedCheckbox() – public void setSelectedCheckbox(Checkbox selected) http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
15
AWT hordozott komponensek • Choice: legördülő lista – public add(String item) – public remove(int pos) lista elemek karbantartása – public remove(String str) – public int getItemCount() – public String getItem(int pos) – public int getSelectedIndex() – public String getSelectedItem() kiválasztott elem – public void select(int pos) – public void select(String str) • Lista: hasonló, csak egyszerre több elem kiválasztását is engedélyezi. További metódusai: – public void setMultipleMode(boolean b) – public String[] getSelectedItems() – public boolean isIndexSelected(int index) http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
16
AWT hordozott komponensek • TextField: egysoros szöveg bevitelére szolgál – public String getText() – public setText(String text) – public String getSelectedText() – public int getSelectionStart() – public int getColumns() – public void setColumns(int columns) – public void setEditable(boolean b) • TextArea: többsoros szöveg bevitelére szolgál – public void getRows(int rows) – public void setRows(int rows) – public void append(String str) – public void insert(String str, int pos) http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
17
AWT hordozott komponensek • Scrollbar: számérték beolvasása csúszkával – public void setMinimum(int newMinimum) – public void setMaximum(int newMaximum) – public int getValue() • TextField: egysoros szöveg bevitelére szolgál – public String getText() – public setText(String text) – public String getSelectedText() – public int getSelectionStart() – public void setEditable(boolean b) • TextArea: többsoros szöveg bevitelére szolgál – public void append(String str) – public void insert(String str, int pos) http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
18
Feladatok 4.1. feladat: Készítsünk egy egyszerű „Hello world” alkalmazást vizuális felületen! 4.2. feladat: készítsünk alkalmazást, amely bemutatja a LayoutManager lehetőségeit! 4.3. feladat: készítsen alkalmazást, amely grafikus felületen keresztül létrehoz Személy objektumokat, majd ezekből feltölt egy tömböt! 4.3. Feladat: készítsünk alkalmazást, amely újabb osztályok (Font, Color) alkalmazásával módosítja a program kinézetét!
http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
19
Eseménykezelés, AWT alapok
Témakörök Felhasználói felületek AWT alapok Események kezelése NetBeans lehetőségei
http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
20
Események kezelése • Esemény: olyan történés, amely az adott komponens működését befolyásolja, és amelyet az adott komponens le is tud kezelni, pl. gomblenyomás, mely után a gomb megfelelő eseménykezelő metódusa elindít egy alkalmazást • Események fajtái: – Közvetlen beviteli esemény, – Komponensek által kiváltott esemény,
• OOP alapú eseménykezelés résztvevői: – Esemény létrehozó („eseményforrás”): pl. egy gomb, amelynek lenyomására elindul az eseménykezelés – Esemény objektum: a lenyomás által létrehozott objektum, amelyet megkapnak a az eseménykezelők – Esemény feldolgozó (esemény nyelő): olyan objektum (illetve annak egy metódusa), amely az esemény feldolgozását végzi el
• Nem minden komponenshez értelmezett minden esemény, a vezérlőeszközől függően más-más eseményekre számíthatunk http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
21
Esemény feldolgozása (AWT) • Eseményt leíró osztályok őse: java.util.EventObject • Az AWT komponensei által küldött események leírása a java.awt.event csomagban java.awt.AWTEvent őssel • Minden ...Event eseményhez tartozik egy ...Listener interfész, amely az eseményre reagáló metódusokat definiálja • A komponensenk által küldött eseményeket az interfész által definiált process...Event(...) metódusok megvalósításával dolgozzák fel a fogadók • Az események fogadásához a figyelő objektumot egy add...Listener(Object) metódus hívásával regisztrálni kell az eseményeket küldő komponensnél • Megszüntetés remove...Listener(Object) művelettel • Ha az interfésznek több metódusa is van, akkor általában tartozik hozzá egy ...Adapter osztály is, amely üres törzzsel implementálja a specifikált metódusokat http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
22
Gomb lenyomásának figyelése • Esemény objektum java.awt.event.ActionEvent – public void setSource(Object newSource) – public int getModifiers() • Esemény figyelők által megvalósítandó interfész java.awt.event.ActionListener – void actionPerformed(ActionEvent e) • Esemény regisztráció metódusai a gomb komponensen java.awt.Button – public void addActionListener(ActionListener l) – public void removeActionListener(ActionListener l)
• Eseménykezelés lépései: – Eseménykezelő objektum példányosítása – Regisztráció az esemény forrásánál http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
23
Egyszerű konténer példa Előző program kiegészítése eseménykezeléssel: import java.awt.event.*; class EsemenyForrasKiiro implements ActionListener { TextField modositando; public EsemenyForrasKiiro(TextField EsemenyForrasKiiro tx) { modositando = tx; } public void actionPerformed(ActionEvent event) { actionPerformed modositando.setText setText("Lenyomtak:" + event.getSource getSource()); setText getSource } } ... EsemenyForrasKiiro szm = new EsemenyForrasKiiro(tx); btn.addActionListener addActionListener(szm); addActionListener ... http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
24
Eseménykezelő architektúrák • Külső eseménykezelő Az eseményt kezelő objektum és az esemény forrása az osztályhierarchia, illetve az objektumpéldányok kialakítása során is egymástól függetlenül kezelhetők (csak az interfész tartja közöttük a kapcsolatot) Az eseménykezelő vagy az eseményobjektumból, vagy előzőleg kapott (pl. a konstruktor) paramétereiből ismerheti a küldő környezetét • Eseménykezelő konténer Mint az előző példában is látható, ez gyakran nem alkalmazható jól a gyakorlatban. Gyakori feladat ugyanis, hogy egy komponens eseménykezelőjének el kell érnie a komponenssel egy ablakon található többi vezérlőt Ezért gyakori megoldás, hogy a komponenseket tartalmazó legmagasabb szinten található konténer (az általunk tervezett ablak) fogadja az összes benne található komponens eseményeit http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
25
Eseménykezelő architektúrák • Több eseménylétrehozóra való feliratkozás Bár minden egyes komponenshez írható egy-egy eseménykezelő osztály, vagy hozható létre egy osztálynak több példánya, a gyakorlatban ez nem minden esetben ajánlott a kód olvashatósága érdekében. Ilyenkor célszerű egy eseménykezelő objektumot több eseményforrásnál is regisztrálni • Küldő meghatározása Ebben az esetben azonban bármelyik komponens indítja az eseményt, mindig ugyanaz az eseménykezelő objektum ugyanaz a metódusa fut le Emiatt szükség lehet a küldő azonosítására, ez azonban mindig egyszerűen megoldható az eseményobjektum getSource() metódusa segítségével • A mai fejlesztői környezetek képesek az eseménykezelő kód generálására, így a fejlesztés jelentősen gyorsítható http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
26
Eseménykezelés, AWT alapok
Témakörök Felhasználói felületek AWT alapok Események kezelése NetBeans lehetőségei
http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
27
NetBeans támogatás • Új Frame osztály létrehozása File/New
• Paraméterek beállítása – Osztály neve – Állomány név – Csomag
http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
28
NetBeans támogatás • Vizuális tervezés
• Generált kód
http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
29
Ajánlott irodalom Az óra anyagához kapcsolódó irodalom • Nyékyné Gaizler Judit: Java 2 útikalauz programozóknak 1.3 I.; ELTE TTK Hallgatói alapítvány, Budapest 259 – 279. .o. • Creating UI with AWT http://brandt.kurowski.net/teaching/java/tutorial.htmlJava • SWING Tutorial http://java.sun.com/docs/books/tutorial/uiswing/index.html
http://www.nik.hu/java
Java programozási nyelv 2007-2008/ősz
30