Dr. Pál László, Sapientia EMTE, Csíkszereda
JAVA PROGRAMOZÁS 5.ELŐADÁS
2014-2015 tavasz
Elrendezésmenedzserek, események
2
Elrendezésmenedzserek
Elrendezésmenedzser 3
Minden konténernek van elrendezésmenedzsere Szükség szerint automatikusan elrendezi a konténer komponenseit, azok helyzetét és méretét A programozó az alapértelmezett elrendezésmenedzsert kicserélheti másra Több lehetőség:
Előredefiniált
osztályt választunk Egyéni rendezőt írunk Nem használunk elrendezés-menedzsert
Elrendezésmenedzser 4
Az ablak pack utasítására automatikusan elrendezi a konténer komponenseit, azok helyzetét és méretét, figyelembe véve a gyerekkomponensek előnyös méreteit (a direkt módon megadott méreteket felülbírálja)
Elrendezésmenedzser 5
Előredefiniált elrendezés-menedzserek: FlowLayout, GridLayout, BorderLayout, CardLayout, GridBagLayout
A Container osztály definiál egy elrendezésmenedzsert (LayoutManager) A konténerbe került komponensek a menedzser felügyelete alá kerülnek A menedzser felülbírálható a setLayout(…) üzenettel vagy meg is szüntethető setLayout(null)
Elrendezésmenedzser 6
A LayoutManager interfész Minden
elrendezés-menedzsernek implementálnia kell a LayoutManager interfészt
Container osztály idetartozó metódusai Component
add(Component comp) Component add(Component comp, int index) void add(Component comp, Object constraints) void add(Component comp, Object constraints, int index) LayoutManager getLayout() void setLayout(LayoutManager mgr) void validate()
FlowLayout – sorfolytonos elrendezés 7
Sorfolytonos elhelyezés balról jobbra Elemek mérete: előnyös méret (preferredSize) alapján, az ablak átméretezésekor nem változik Sorok igazítása(align): balra, jobbra, középre Komponensek közötti konstans távolság vízszintesen(hgap) és függőlegesen(vgap) JPanel és Applet alapértelmezett elrendezésmenedzsere
FlowLayout – Példa 8
GridLayout – rácsos elrendezés 9
Megadott sor és oszlopszámú rácson való elhelyezés Rács cellái: egyenlő méretű téglalapok, minden komponens egy téglalapot foglal el (nincs lyuk!) Elemek mérete: cellaméret, az ablak átméretezésekor változik Komponensek közötti konstans távolság vízszintesen(hgap) és függőlegesen(vgap)
GridLayout – Példa 10
11
BorderLayout – határ menti elrendezés
4+1 égtájon való elhelyezés: North (Észak), South (Dél), West (Nyugat), East (Kelet), Center (Közép)
Azonos égtájon levő elemek takarják egymást
Elemek mérete az ablak átméretezésekor változik
Komponensek közötti konstans távolság vízszintesen(hgap) és függőlegesen(vgap) Window és leszármazottainak (JFrame, JDialog), JFrame tartalompaneljének elrendezésmenedzsere
BorderLayout – Példa 12
JPanel, az összefogó konténer 13
Konténer, mely összefogja a benne levő elemeket
Láthatatlan, vagy látható (szín, keret)
Alapértelmezésben dupla pufferelésű
Saját elrendezés-menedzsere van, alapértelmezésben FlowLayout
JPanel - Példa 14
pnNev pnSzulev pnGomb
szemelyPanel (kitölti a keretet)
JPanel - Példa 15
JPanel - Példa 16
17
Események
Eseményvezérelt programozás 18
A GUI eseményvezérelt, azaz a programot a futás közben keletkezett események vezérlik Esemény: egy objektum, amely mindig egy forrásobjektumhoz kötődik Eseménydelegációs modell: segítségével az esemény eljut a megfelelő figyelő objektumokhoz, amelyek feldolgozzák az eseményt Vannak alacsony szintű illetve magas szintű események
Mintaprogram 19
Feladat: tegyünk a keretbe gombot. Ha lenyomják a gombot, akkor a számítógép sípoljon egyet.
:PittyegoKeret az esemény figyelője (ActionListener) btPittyeg:JButton az esemény forrása (ActionEvent)
Mintaprogram 20
Mintaprogram 21
Eseményosztályok 22
Esemény: az alkalmazás által létrehozott objektum, mely a vele összefüggő információkat tartalmazza Esemény útja operációs rendszer eseménysora Alkalmazás forrásobjektum esemény figyelői
A komponensen a felhasználó csak akkor válthat ki eseményt, ha a komponens eleme az alkalmazás komponenshierarchiájának látható
Eseményosztályok 23
Minden eseményosztály közös őse a java.util.EventObject A Swing az AWT eseménymodellt használja Az AWT események a java.awt.event csomagban találhatók, míg a Swing események a javax.swing.event csomagban Az AWT események közös őse a java.awt.AWTEvent absztrakt osztály
Eseményosztályok - Osztályhierarchia 24
Eseményosztályok 25
EventObject osztály protected
Object source Object getSource()
AWTEvent osztály Mezők: protected
int id (Pl.: MOUSE_CLICKED) protected boolean consumed static final int RESERVED_ID_MAX static final long FOCUS_EVENT_MASK static final long KEY_EVENT_MASK
Eseményosztályok 26
AWTEvent osztály Metódusok: int
getID() protected void consume() protected boolean isConsumed()
Alacsony szintű események 27
Operációs rendszer szintjén történő elemi esemény Forrása csak komponens lehet ComponentEvent utódja Alacsony szintű AWT események: ComponentEvent:
Komponensesemény ContainerEvent: Konténeresemény FocusEvent: Fókuszesemény WindowEvent: Ablakesemény KeyEvent: Billentyűzetesemény MouseEvent: Egéresemény
Magas szintű események 28
Minden esemény, ami nem alacsony szintű Általában logikai esemény Forrása nem feltétlenül komponens Magas szintű események: ActionEvent:
Akcióesemény AdjustmentEvent: Igazítási esemény ListSelectionEvent: Listakiválasztás-esemény DocumentEvent: Dokumentumesemény …
Eseménydelegációs modell 29
Modell elemei: Eseményobjektum Eseményforrás
(forrásobjektum) és figyelőláncai Eseményfigyelő Az
eseményt figyelő és lekezelő objektum Fel kell fűzni a forrásobjektum megfelelő figyelőláncára Osztályának implementálnia kell a figyelő interfészt
Esemény feldolgozása Forrásobjektum Figyelő
objektumok
30
A JButton akció- és billentyűzetfigyelő lánca
Alacsony szintű események 31
Alacsony szintű események 32
Magas szintű események 33
A felhasználói felület tervezése 34
Felhasználói felület képének megtervezése: keret és komponensei Eseményforrások meghatározása: azonosító/osztály + zárójelben esemény osztálya Eseményfigyelők meghatározása: azonosító/osztály + zárójelben: figyelő interfész, figyelt objektum(ok) azonosítója (azonosítói) Szükség esetén tulajdonosi hierarchia megtervezése
Példa - Nyomásszámláló 35
Feladat: tegyünk két nyomógombot a keretbe, indulásképpen mindkettőnek "0" legyen a felirata! Ha lenyomnak egy gombot, akkor növeljük meg eggyel a rajta levő szám értékét! :NyomasSzamlalo (ActionListener, btBal,btJobb)
btBal (ActionEvent)
btJobb (ActionEvent)
Példa - Nyomásszámláló 36
Példa - Nyomásszámláló 37
Feladat: Készítsünk egy keretet! Ha a keretet be akarják csukni, akkor csukódjon be úgy, hogy a program rövid hangot hallat és befejezi futását
:AblakBecsuk (WindowEvent) (WindowListener)
Példa - Nyomásszámláló 38
Eseményadapterek 39
Eseményadapter:
Absztrakt osztály
A figyelő interfészt üres metódusokkal implementálja
Figyelő interfész ComponentListener ContainerListener FocusListener KeyListener MouseListener MouseMotionListener W indowListener
Adapter osztály ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter W indowAdapter
Metódusok száma 4 2 2 3 5 2 7
Eseményadapterek 40
Jó lenne, ha az eseménykezelő metódusok osztálya örökölhetné az eseményadaptert Gond: Javában nincs kettős öröklés, egy osztály nem lehet adapter és komponens egyszerre Megoldás: eseményadapter osztály alkalmazása mint belső osztály
Eseményadapterek - Példa 41
Ablak becsukása adapter osztállyal:
Eseményadapterek - Példa 42
Ablak becsukása adapter osztállyal:
Könyvészet 43
Angster Erzsébet, Objektumorientált tervezés és programozás. Java I-II. (Bazele programării orientate pe obiecte), Ed. 4 Kör Bt., Budapesta, 2002. Kathy Sierra, Bert Bates: Agyhullám: Java, Kiskapú, 2011.