5. 6. 7. 8. 9. 10. 11. 12.
A felhasználói interfész felépítése Elrendezésmenedzserek Eseményvezérelt programozás Swing-komponensek Grafika, képek Alacsony szintű események Belső eseménykezelés, komponensgyártás Applet
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 1
5. A felhasználói interfész felépítése 1. Komponensek és azok tulajdonosi hierarchiája 2. AWT és Swing osztályhierarchia 3. Swing mintaprogram 4 Jellemzők
8. Az absztrakt JComponent osztály
5. Pont, méret, téglalap
9. Container osztály
6. Koordinátarendszer
10. java.awt.Window osztály
7. Szín, betű
11. JFrame osztály
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 2
Komponensek tulajdonosi hierarchiája
:JFrame
:JMenuBar
:JDialog
:JWindow
contentPane
contentPane :JPanel
Konténer komponens
:JPanel
:JLabel :JTextField :JButton :JButton
:JLabel
:JButton
:JTextField
:JTextArea :JComboBox :JList :JCheckBox
:JScrollbar
:JRadioButton :JRadioButton :ButtonGroup
Vezérlő komponens
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 3
Tulajdonosi viszony Konténer és komponense: A konténer komponensei fizikailag sosem kerülhetnek a konténeren kívülre Ablak és ablaka: A gyerek ablakok elhelyezkedése és mérete független a szülő ablaktól
Tulajdonosi hierarchia Felépítése a programozó feladata! Az a komponens, amely nincs rajta a tulajdonosi hierarchián, nem látható és nem képes eseményekre reagálni! Szülő megszűnése gyerek megszűnése Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 4
java.lang.Object +--FlowLayout +--GridLayout +--BorderLayout +--java.util.EventObject | +--AWTEvent | + ... +--Point +--Dimension +--Rectangle +--Polygon +--Font +--Color +--Graphics +--Image +--Component | +--Label | +--Button | +--... | +--Container | | +--Panel | | | +--Applet | | | | +--javax.swing.JApplet | | +--java.awt.Window | | | +-- javax.swing.JWindow | | | +--java.awt.Frame | | | | +-- javax.swing.JFrame | | | +-- java.awt.Dialog | | | | +--javax.swing.JDialog
java.awt
Gábor Dénes Főiskola (IAI)
java.lang.Object +--Component | +--Container | | +--JComponent | | | +--JLabel | | | +--AbstractButton | | | | +--JButton | | | | +--JToggleButton | | | | | +--JCheckBox | | | | | +--JRadioButton | | | | +--JMenuItem | | | | | +--JCheckBoxMenuItem | | | | | +--JRadioButtonMenuItem | | | | | +--JMenu | | | +--JMenuBar | | | +--JComboBox | | | +--JTextComponent | | | | +--JTextField | | | | +--JTextArea | | | +--JList | | | +--JScrollBar | | | +--JScrollPane | | | +--JPanel | | | +--JColorChooser | | | +--JOptionPane +--ButtonGroup +--ImageIcon +--Timer
AWT és Swing
javax.swing
Programozási technológia (Java) - II. / 5
java.lang.Object +--FlowLayout +--GridLayout +--BorderLayout +--java.util.EventObject | +--AWTEvent | + ... +--Point +--Dimension +--Rectangle +--Polygon +--Font +--Color +--Graphics +--Image Gábor Dénes Főiskola (IAI)
java.lang.Object +--Component java.awt | +--Label | +--Button | +--... | +--Container | | +--Panel | | | +--Applet | | +--Window | | | +--Frame | | | +--Dialog
Programozási technológia (Java) - II. / 6
Object +--Component | +--Container | | +--Panel | | | +--Applet | | | | +--JApplet | | +--Window | | | +--JWindow | | | +--Frame | | | | +--JFrame | | | +--Dialog | | | | +--JDialog | | +--JComponent | | | + ... +--ButtonGroup +--ImageIcon +--Timer
Gábor Dénes Főiskola (IAI)
JComponent javax.swing +--JLabel +--AbstractButton | +--JButton | +--JToggleButton | | +--JCheckBox | | +--JRadioButton | +--JMenuItem | | +--JCheckBoxMenuItem | | +--JRadioButtonMenuItem | | +--JMenu +--JMenuBar +--JComboBox +--JTextComponent | +--JTextField | +--JTextArea +--JList +--JScrollBar +--JScrollPane +--JPanel +--JColorChooser +--JOptionPane Programozási technológia (Java) - II. / 7
Swing mintaprogram Feladat – Frame teszt Készítsük el az itt látható keretet! A keret bal felső sarka a képernyő (100,50) pozícióján legyen, mérete 300*100, címe: Frame teszt. A kereten legyen egy címke a Döntsd el: szöveggel, továbbá legyen két nyomógomb, OK és Nem OK felirattal! A programnak egyelőre nem kell reagálnia semmilyen eseményre. fr
lbInfo btOk btNemOk Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 8
1. megoldás – Keret összerakása kívülről JFrame() setTitle("Frame teszt") setBounds(100,50,300,100) setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) cp = getContentPane() setVisible(true)
main
FrameTest1
setLayout(new FlowLayout()) add(lbInfo) add(btOk) add(btNemOk)
lbInfo:JLabel Gábor Dénes Főiskola (IAI)
fr:JFrame
Együttműködési diagram
cp:JPanel
:FlowLayout
btOk:JButton
btNemOk:JButton
Programozási technológia (Java) - II. / 9
import java.awt.*; import javax.swing.*; public class FrameTest1 { public static void main (String args[]) { JFrame fr; JLabel lbInfo; JButton btOk, btNemOk; fr = new JFrame();
fr.setTitle("Frame teszt"); fr.setBounds(100,50,300,100); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 10
Container cp = fr.getContentPane(); cp.setLayout(new FlowLayout());
lbInfo = new JLabel("Döntsd el:"); btOk = new JButton("OK"); btNemOk = new JButton("Nem OK"); cp.add(lbInfo); cp.add(btOk); cp.add(btNemOk); fr.setVisible(true); } // main } // FrameTest1 Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 11
2. megoldás – Keret összerakása belülről main SpecFrame() FrameTest2
setTitle("Frame teszt") setBounds(100,50,300,100) cp = getContentPane() setVisible(true), setD.CloseOp.(...) :SpecFrame
Együttműködési diagram
lbInfo:JLabel Gábor Dénes Főiskola (IAI)
setLayout(new FlowLayout()) add(lbInfo) add(btOk) cp:JPanel add(btNemOk) :FlowLayout
btOk:JButton
btNemOk:JButton
Programozási technológia (Java) - II. / 12
import java.awt.*; import javax.swing.*; class SpecFrame extends JFrame { JLabel lbInfo; JButton btOk, btNemOk; public SpecFrame() { setTitle("Frame teszt"); setBounds(100,50,300,100); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container cp = getContentPane(); cp.setLayout(new FlowLayout()); lbInfo = new JLabel("Döntsd el:"); btOk = new JButton("OK"); btNemOk = new JButton("Nem OK"); Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 13
cp.add(lbInfo); cp.add(btOk); cp.add(btNemOk); setVisible(true); } // konstruktor } // SpecFrame public class FrameTest2 { public static void main (String args[]) { new SpecFrame(); } // main } // FrameTest2 Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 14
3. megoldás – A konténer komponenseit nem deklaráljuk, pakolunk class SpecFrame extends JFrame { public SpecFrame() { … cp.add(new JLabel("Döntsd el:")); cp.add(new JButton("OK")); cp.add(new JButton("Nem OK")); pack(); show(); } // konstruktor } // SpecFrame Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 15
Jellemzők Property: Beállítható és lekérdezhető tulajdonság Deklaráció: PropType propName; • beállító metódus (set): void setPropName(PropType propName) • lekérdező metódus (get / is): PropType getPropName() boolean isPropName() Példák: Jellemző Beállító metódus Lekérdező metódus int columns void setColumns(int columns) int getColumns() boolean visible void setVisible(boolean visible) boolean isVisible() Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 16
Pont, méret, téglalap Osztályok a látható komponensek paraméterezéséhez Point osztály: megjegyzi egy pont x és y koordinátáit Dimension osztály: megjegyzi egy méretét (szélességét és magasságát)
téglalap
Rectangle osztály: megjegyzi egy téglalap • helyzetét (location): bal felső sarkának x és y koordinátáit, és • méretét (dimension): szélességét (width) és magasságát (height) Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 17
Feladat – Pontok és téglalapok Adva van két téglalap: az egyik téglalap bal felső sarka a (100,100) pont, mérete 50*30; a másik téglalap bal felső sarka a (120,80) pont, mérete 20*60. Határozzuk meg a téglalapok közös részét! Vizsgáljuk meg, hogy a (130,110) pont benne van-e a közös részben! Határozzuk meg azt a legkisebb téglalapot, amely tartalmazza a téglalapokat és egy megadott pontsorozat összes pontját!
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 18
import java.awt.*; public class PontTegla { public static void main (String args[]) { Rectangle r1 = new Rectangle(100,100,50,30); Rectangle r2 = new Rectangle(); p r2.setLocation(120,80); r2.setSize(20,60); r2
Rectangle kozos = r1.intersection(r2); System.out.println("Közös: "+kozos);
nagy
r1 kozos
Point p = new Point(130,110); Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 19
if (kozos.contains(p)) System.out.println(p+" benne van"); else System.out.println(p+" nincs benne"); Point[] pontok = {new Point(50,80),new Point(15,70), new Point(30,95),new Point(120,200)}; Rectangle nagy = r1.union(r2); for (int i=0; i<pontok.length; i++) nagy.add(pontok[i]); System.out.println("Nagy: "+nagy); System.out.println("Nagy mérete: "+nagy.getSize());
} } Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 20
Koordinátarendszer (0,0)
x
screenSize.width=1024
y
screenSize.height=768
A képernyő bal alsó sarka: (1023,767)
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize(); Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 21
Betű, szín Font osztály Adott tulajdonságú fontot (betűfajtát) tárol Tulajdonságok • String fontName (név, pl.: Arial, Monospaced) • int style (stílus, pl.: PLAIN, BOLD, ITALIC) • int size (betűméret pontokban)
Példánya változtathatatlan Minden komponensnek van fontja Logikai fontnevek: SansSerif, Serif, Monospaced, Dialog, DialogInput Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 22
Color osztály RGB színt tárol Minden szín a 3 alapszín (piros,zöld,kék) keveréke Tulajdonságok • int red (piros összetevő, 0..255) • int green (zöld összetevő, 0..255) • int blue (kék összetevő, 0..255) Példánya változtathatatlan Minden komponensnek van egy háttérszíne és egy előtérszíne (betűszíne) Konstans szín objektumokat definiál: Color.black, Color.blue, Color.white, ... Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 23
SystemColor osztály Rendszer által használt színeket definiál: SystemColor.info, SystemColor.infoText, SystemColor.desktop, ...
Színek, betűk használata lb = new JLabel("Szöveg:");
lb.setFont(new Font(”Arial",Font.BOLD,24)); lb.setBackground(SystemColor.control); lb.setForeground(Color.red);
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 24
Az absztrakt JComponent osztály Absztrakt osztály A képernyőn megjelenő Swing komponensek közös őse
Mezők • static final float CENTER_ALIGNMENT, ...
Jellemzők • Color background Color foreground • boolean opaque Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 25
Jellemzők (folyt.) • • • •
• • • • •
Font font Cursor cursor Border border Dimension maximumSize Dimension minimumSize Dimension preferredSize float alignmentX float alignmentY String toolTipText boolean visible boolean enabled boolean requestFocusEnabled
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 26
Helyzet, méret • int getX() int getY() • int getWidth() int getHeight() • Rectangle getBounds() • Point getLocation() Point getLocationOnScreen() • void setBounds(int x, int y, int width, int height) void setLocation(int x, int y) void setSize(int width, int height) • boolean contains(int x, int y) boolean contains(Point p) Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 27
Láthatóság, érvényesség • boolean isDisplayable() • void validate()
Fókusz, eseményfogadás • boolean hasFocus() • void requestFocus() • void transferFocus()
Szülő, állapot • Container getParent() • String toString() • void list() Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 28
java.awt.Container osztály Konténer-komponensek közös őse
Jellemzők • LayoutManager layoutMgr
Komponens hozzáadása, kivétele • Component add(Component comp) Component add(Component comp, int index) • void remove(Component comp) void remove(int index) void removeAll() Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 29
Gyerekkomponensek • int getComponentCount()
• Component[] getComponents() • Component getComponent(int n) • Component getComponentAt(int x, int y) Component getComponentAt(Point p) • boolean isAncestorOf(Component comp)
Elrendezés • Dimension getMaximumSize() • Dimension getMinimumSize() • Dimension getPreferredSize() Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 30
java.awt.Window osztály Összes AWT és Swing ablak komponens közös őse Utódai: Frame, JFrame, Dialog, JDialog, JWindow
Metódusok • void pack() • void show() boolean isShowing() void hide() • void setLocationRelativeTo(Component c) • void toBack() void toFront() • void dispose() Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 31
Metódusok (folyt.) • void addWindowListener(WindowListener l)
• void removeWindowListener(WindowListener l) • Component getFocusOwner()
• Window getOwner() • Window[] getOwnedWindows()
Aktív ablak Az operációs rendszerben pontosan egy alkalmazás aktív, egy alkalmazásban pedig pontosan egy ablak aktív. Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 32
JFrame osztály Közvetlen ős: java.awt.Frame A Swing egyetlen natív komponense
Keret: legfelső szintű ablak, nincs tulajdonosa Van szegélye, ikonja, címe és menüsora
Komponenseit a tartalompanelbe (content pane) kell tenni
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 33
Jellemzők • String title
• Image iconImage • MenuBar menuBar
• boolean resizable • int state
Metódusok • Container getContentPane()
• setDefaultCloseOperation(int operation) • static Frame[] getFrames() Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 34
6. Elrendezésmenedzserek 1. Az elrendezésmenedzserek tulajdonságai 2. FlowLayout – sorfolytonos elrendezés 3. GridLayout – rácsos elrendezés 4. BorderLayout – határ menti elrendezés 5. JPanel, az összefogó konténer Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 35
Elrendezésmenedzserek konténer konténer :Container
komponens1
layoutManager :LayoutManager
komponens2 komponens3
komponens1
komponens2
komponens3
Minden konténernek van elrendezésmenedzsere
Az ablak pack utasítására automatikusan elrendezi a konténer komponenseit, azok helyzetét és méretét Előredefiniált elrendezésmenedzserek: FlowLayout, GridLayout, BorderLayout, CardLayout, GridBagLayout Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 36
LayoutManager interfész Minden elrendezésmenedzsernek 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() Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 37
FlowLayout – sorfolytonos elrendezés 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 Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 38
Feladat – FlowLayoutTest Tegyünk az alkalmazás 700*100-as méretű keretébe 10 szövegmező (JTextField) és nyomógomb (JButton) párost, a sorokat középre igazítva! A szövegmezők 5 oszlopnyi helyet foglaljanak; a gombokon a ”Gomb” felirat és a gomb sorszáma szerepeljen! A futó programban interaktív módon méretezzük át a keretet, és közben figyeljük meg, hogyan változik az elemek elrendezése! vgap=5
hgap=5 Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 39
public class FlowLayoutTest extends JFrame { private Container cp = getContentPane(); public FlowLayoutTest() { setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("FlowLayout"); LayoutManager lm = new FlowLayout(); cp.setLayout(lm); for (int i=1; i<=10; i++) { cp.add(new JTextField(5)); cp.add(new JButton("Gomb "+i)); } setSize(700,150); show(); } ... } Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 40
GridLayout – rácsos elrendezés 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) Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 41
Feladat – GridLayoutTest Tegyünk az alkalmazás keretére képzeletben egy 6*2-es rácsot, és tegyünk az első 10 rácshelyre egy-egy sorszámozott nyomógombot! A komponensek közötti vízszintes távolság legyen 20 pont, a függőleges távolság pedig legyen 10 pont! A futó programban interaktív módon méretezzük át a keretet!
vgap=10
hgap=20 Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 42
public class GridLayoutTest extends JFrame { public GridLayoutTest() { setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("GridLayout"); getContentPane().setLayout(new GridLayout(6,2,20,10)); for (int i=1; i<=10; i++) { getContentPane().add(new JButton("Gomb "+i)); } pack(); show(); } public static void main (String args[]) { new GridLayoutTest(); } } Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 43
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 Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 44
Feladat – BorderLayoutTest Tegyünk a 400*200-as méretű keretbe 5 darab nyomógombot a képen látható módon! A vízszintes köz 2, függőleges köz 1 legyen! A futó programban interaktív módon méretezzük át a keretet!
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 45
class BorderLayoutTest extends JFrame { Container cp = getContentPane(); public BorderLayoutTest() { setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("BorderLayout"); cp.setLayout(new BorderLayout(2,1)); cp.add(new JButton("North - Észak - Felső"),"North"); cp.add(new JButton("South - Dél"),"South"); cp.add(new JButton("West - Nyugat - Bal"),"West"); cp.add(new JButton("East - Kelet - Jobb"),"East"); cp.add(new JButton("Center - Középső"),"Center");
}
} …
setSize(400,200); show();
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 46
JPanel, az összefogó konténer 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ésmenedzsere van, alapértelmezésben FlowLayout
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 47
Feladat – Személy bevitel Készítsük el az ábrán látható keretet! A Név beviteli mező 20 oszlopos, a Születési év mező 6 oszlopos legyen! A két címkézett beviteli mező, és a gombok egy-egy sort alkossanak; a sorok egymás alatt jelenjenek meg!
pnNev
szemelyPanel (kitölti a keretet)
pnSzulev pnGomb
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 48
Tulajdonosi hierarchia
:SzemelyBevitel
contentPane:JPanel
:SzemelyPanel
pnNev: JPanel
:FlowLayout :JLabel
pnGomb: JPanel
pnSzulev: JPanel
:FlowLayout tfNev :JTextField
Gábor Dénes Főiskola (IAI)
:GridLayout
:JLabel
:FlowLayout tfSzulev :JTextField
btOk :JButton
btCancel :JButton
Programozási technológia (Java) - II. / 49
7. Eseményvezérelt programozás 1. Mintaprogram 2. Eseményosztályok
3. Alacsony és magas szintű események 4. Eseménydelegációs modell 5. A felhasználói felület tervezése 6. Eseményadapterek Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 50
Mintaprogram Feladat – Pittyegő keret Tegyünk a keretbe egy ”Pittyeg” feliratú gombot. Ha lenyomják a gombot, akkor a számítógép pittyegjen egyet!
:PittyegoKeret az esemény figyelője (ActionListener) btPittyeg:JButton az esemény forrása (ActionEvent)
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 51
Együttműködési diagram addActionListener(this) PittyegoKeret:ActionListener Figyelőobjektum (keret)
ev:ActionEvent
btPittyeg:JButton actionPerformed(ev)
Forrásobjektum (gomb)
Osztálydiagram «interfész» ActionListener
JFrame
+actionPerformed(ev:ActionEvent) Component PittyegoKeret +PittyegoKeret() +actionPerformed(ev:ActionEvent) +main(args:String[]) Gábor Dénes Főiskola (IAI)
JButton
+addActionListener(l:ActionListener) Programozási technológia (Java) - II. / 52
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class PittyegoKeret extends JFrame implements ActionListener { private JButton btPittyeg = new JButton("Pittyeg"); public PittyegoKeret() { setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().add(btPittyeg); btPittyeg.addActionListener(this); pack(); show(); } Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 53
public void actionPerformed (ActionEvent ev) { Toolkit.getDefaultToolkit().beep(); } public static void main (String args[]) { new PittyegoKeret(); } } // PittyegoKeret
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 54
Eseményosztályok 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ó Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 55
Eseményosztályok Alacsony szintű események
java::lang::Object java::util::EventObject
java::awt::AWTEvent javax::swing::event
ListSelectionEvent
java::awt::event ComponentEvent
ActionEvent
ContainerEvent
FocusEvent
AdjustmentEvent
…
<
> DocumentEvent Magas szintű események
KeyEvent Gábor Dénes Főiskola (IAI)
InputEvent
WindowEvent
MouseEvent
Programozási technológia (Java) - II. / 56
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 ... Metódusok • int getID() • protected void consume() protected boolean isConsumed() Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 57
Alacsony és magas szintű események Alacsony szintű esemény
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
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 58
Magas szintű esemény 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 • …
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 59
Eseménydelegációs modell 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 Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 60
A JButton akció- és billentyűzetfigyelő lánca addActionListener() removeActionListener() addKeyListener() removeKeyListener()
:ActionListener
:ActionListener ...
actionPerformed(ev) bt:JButton
:KeyListener :KeyListener
ev:ActionEvent vagy ev:KeyEvent
keyTyped(ev) keyPressed(ev) keyReleased(ev)
... Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 61
Eseményosztály
Forrás
Figyelő interfész Felfűző metódus Lekezelő metódusok Alacsony szintű események ComponentEvent Component ComponentListener addComponentListener componentResized componentMoved componentShown componentHidden ContainerEvent Container ContainerListener addContainerListener componentAdded componentRemoved focusGained FocusEvent Component FocusListener addFocusListener focusLost keyTyped KeyEvent Component KeyListener addKeyListener keyPressed keyReleased mousePressed MouseEvent Component MouseListener addMouseListener mouseReleased mouseEntered mouseExited mouseClicked mouseDragged MouseEvent Component MouseMotionaddMouseMotionmouseMoved Listener Listener
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 62
Eseményosztály Forrás WindowEvent Window
Figyelő interfész Felfűző metódus WindowListener addWindowListener
Lekezelő metódusok windowOpened windowClosing windowClosed windowIconified windowDeiconified windowActivated windowDeactivated
Magas szintű események ActionEvent Abs.B. utódai ActionListener addActionListener actionPerformed JComboBox JTextField AdjustmentEvent JScrollBar AdjustmentListener addAdjustmentListener adjustmentValueChanged ListSelectionJList ListSelectionaddListSelectionvalueChanged Event Listener Listener DocumentEvent Document DocumentListener addDocumentListener insertUpdate removeUpdate changedUpdate Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 63
A felhasználói felület tervezése 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 Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 64
Feladat – Nyomásszámláló 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)
Gábor Dénes Főiskola (IAI)
btJobb (ActionEvent)
Programozási technológia (Java) - II. / 65
public class NyomasSzamlalo extends JFrame implements ActionListener { private JButton btBal, btJobb; private int nBal=0, nJobb=0; public NyomasSzamlalo() { setDefaultCloseOperation(EXIT_ON_CLOSE); Container cp = getContentPane(); cp.setLayout(new GridLayout(1,2)); cp.add(btBal = new JButton(""+nBal)); cp.add(btJobb = new JButton(""+nJobb)); btBal.addActionListener(this); btJobb.addActionListener(this); pack(); show(); } Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 66
public void actionPerformed (ActionEvent ev) { if (ev.getSource()==btBal) btBal.setText(""+ ++nBal); else btJobb.setText(""+ ++nJobb); } public static void main (String args[]) { new NyomasSzamlalo(); }
} Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 67
Feladat – Ablak becsukása 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)
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 68
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class AblakBecsuk extends JFrame implements WindowListener { public AblakBecsuk () { setBounds(100,100,200,100); addWindowListener(this); show(); } Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 69
public void windowOpened(WindowEvent ev) { } public void windowClosing(WindowEvent ev) { Toolkit.getDefaultToolkit().beep(); System.exit(0); } public void windowClosed(WindowEvent ev) { } public void windowIconified(WindowEvent ev) { } public void windowDeiconified(WindowEvent ev) { } public void windowActivated(WindowEvent ev) { } public void windowDeactivated(WindowEvent ev) { }
}
public static void main (String args[]) { new AblakBecsuk(); }
Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 70
Eseményadapterek Eseményadapter Absztrakt osztály A figyelő interfészt üres metódusokkal implementálja Figyelő interfész ComponentListener ContainerListener FocusListener KeyListener MouseListener MouseMotionListener WindowListener Gábor Dénes Főiskola (IAI)
Adapter osztály ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter
Metódusok száma 4 2 2 3 5 2 7
Programozási technológia (Java) - II. / 71
Feladat – Adapterek Oldjuk meg a Az Ablak becsukása feladatot eseményadapterrel! Object
«interfész» WindowListener
WindowAdapter +windowOpened(ev:WindowEvent) +windowClosing(ev:WindowEvent) +windowClosed(ev:WindowEvent) +windowIconified(ev:WindowEvent) +windowDeiconified(ev:WindowEvent) +windowActivated(ev:WindowEvent) +windowDeactivated(ev:WindowEvent) Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 72
1. megoldás: Esemény lekezelése külső eseményadapter osztályban … class WindowFigyelo extends WindowAdapter { public void windowClosing(WindowEvent ev) { System.exit(0); } } public class Adapter1 extends JFrame { public Adapter1() { setBounds(300,300,300,200); addWindowListener(new WindowFigyelo()); show(); } … // main } Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 73
2. megoldás: Esemény lekezelése belső eseményadapter osztályban … public class Adapter2 extends JFrame { class WindowFigyelo extends WindowAdapter { public void windowClosing(WindowEvent ev) { System.exit(0); } } public Adapter2() { setBounds(300,300,300,200); addWindowListener(new WindowFigyelo()); show(); } … } Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 74
3. megoldás: Esemény lekezelése névtelen eseményadapter osztályban … public class Adapter3 extends JFrame { public Adapter3() { setBounds(300,300,300,200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); show(); } … } Gábor Dénes Főiskola (IAI)
Programozási technológia (Java) - II. / 75