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
8 FlowLayout Példa
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)
10 GridLayout Példa
BorderLayout határ menti 11 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
12 BorderLayout Példa
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 szemelypanel (kitölti a keretet) pngomb
15 JPanel - Példa
16 JPanel - Példa
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)
20 Mintaprogram
21 Mintaprogram
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
24 Eseményosztályok - Osztályhierarchia
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: 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
31 Alacsony szintű események
32 Alacsony szintű események
33 Magas szintű események
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! btbal (ActionEvent) :NyomasSzamlalo (ActionListener, btbal,btjobb) btjobb (ActionEvent)
36 Példa - Nyomásszámláló
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)
38 Példa - Nyomásszámláló
Eseményadapterek 39 Eseményadapter: Absztrakt osztály A figyelő interfészt üres metódusokkal implementálja Figyelő interfész Adapter osztály Metódusok száma ComponentListener ComponentAdapter 4 ContainerListener ContainerAdapter 2 FocusListener FocusAdapter 2 KeyListener KeyAdapter 3 MouseListener MouseAdapter 5 MouseMotionListener MouseMotionAdapter 2 W indowlistener W indowadapter 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.