Upload
others
View
24
Download
0
Embed Size (px)
Citation preview
JAVA PROGRAMOZÁS5.ELŐADÁS
Dr. Pál László, Sapientia EMTE, Csíkszereda
5.ELŐADÁS
Elrendezésmenedzserek, események 2014-2015 tavasz
Elrendezésmenedzserek2
Elrendezésmenedzser3
� Minden konténernek van elrendezésmenedzsere� Szükség szerint automatikusan elrendezi a
konténer komponenseit, azok helyzetét és méretétméretét
� A programozó az alapértelmezett elrendezés-menedzsert 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ésmenedzser4
� 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ésmenedzser5
� Előredefiniált elrendezés-menedzserek:FlowLayout, GridLayout, BorderLayout,
CardLayout, GridBagLayout
� A Container osztály definiál egy elrendezés-A Container osztály definiál egy elrendezés-menedzsert (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ésmenedzser6
� 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és7
� 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� 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és-menedzsere
FlowLayout – Példa8
GridLayout – rácsos elrendezés9
� 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ése-
kor változik
� Komponensek közötti konstans távolság
vízszintesen(hgap) és függőlegesen(vgap)
GridLayout – Példa10
BorderLayout – határ menti elrendezés
11
� 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� Elemek mérete az ablak átméretezésekor változik
� Komponensek közötti konstans távolságvízszintesen(hgap) és függőlegesen(vgap)
� Window és leszármazottainak (JFrame, JDialog), JFrame tartalompaneljének elrendezésmenedzsere
BorderLayout – Példa12
JPanel, az összefogó konténer13
� Konténer, mely összefogja a benne levő elemeket
� Láthatatlan, vagy látható (szín, keret)
� Alapértelmezésben dupla pufferelésű� Alapértelmezésben dupla pufferelésű
� Saját elrendezés-menedzsere van,
alapértelmezésben FlowLayout
JPanel - Példa14
pnNev
pnSzulev
szemelyPanel(kitölti a keretet)
pnGomb
JPanel - Példa15
JPanel - Példa16
Események17
Eseményvezérelt programozás18
� 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ődikforrá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
Mintaprogram19
� Feladat: tegyünk a keretbe gombot. Ha lenyomják a gombot, akkor a számítógép sípoljon egyet.
:PittyegoKeretaz esemény figyelője (ActionListener)
btPittyeg:JButtonaz esemény forrása (ActionEvent)
Mintaprogram20
Mintaprogram21
Eseményosztályok22
� 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� 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ályok23
� 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 � 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ályhierarchia24
Eseményosztályok25
� EventObject osztály
� protected Object source
� Object getSource()
� AWTEvent osztály� 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ályok26
� AWTEvent osztály
� Metódusok:
� int getID()
� protected void consume()
� protected boolean isConsumed()
Alacsony szintű események27
� 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ények28
� Minden esemény, ami nem alacsony szintű
� Általában logikai esemény
� Forrása nem feltétlenül komponens
� Magas szintű események:� 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 modell29
� Modell elemei:
� Eseményobjektum
� Eseményforrás (forrásobjektum) és figyelőláncai
� Eseményfigyelő� 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
A JButton akció- és billentyűzetfigyelő
lánca30
Alacsony szintű események31
Alacsony szintű események32
Magas szintű események33
A felhasználói felület tervezése34
� 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+ 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!
btJobb (ActionEvent)btBal (ActionEvent)
:NyomasSzamlalo(ActionListener,btBal,btJobb)
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ényadapterek39
� 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
WindowListener WindowAdapter 7
Eseményadapterek40
� 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élda41
� Ablak becsukása adapter osztállyal:
Eseményadapterek - Példa42
� Ablak becsukása adapter osztállyal:
Könyvészet43
� 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.2011.