II. Grafikus felhasználói interfész

Slides:



Advertisements
Hasonló előadás
© Kozsik Tamás Különböző nyelvekhez igazítás Internationalization - i18n.
Advertisements

Osztály leszármaztatás
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 8. rész – Grafikus felhasználói felület Nyugat-Magyarországi Egyetem Faipari Mérnöki.
Programozás III STRING-XML.
AZ OOP ALAPJAI.
© Kozsik Tamás Appletek A Java nyelv elsődleges számú reklámja HTML oldalak aktívvá tevéséhez Kisalkalmazás WEB-böngésző által futtatott Java.
Jt Java Feltételek, logikai kifejezések. jt 2 Logikai operátorok Logikai kifejezésekre alkalmazhatók a következő műveletek: 1. nem! 2. és&ill.&& 3. kizáró.
Programozás III GRAFIKUS FELÜLETEK.
Öröklődés 2..
© Kozsik Tamás Tömbök, kollekciók és egyéb alaposztályok.
© Kozsik Tamás Grafikus felhasználói felületek.
© Kozsik Tamás JavaBeans Nagyon divatos technológia Nem tévesztendő össze az Enterprise Java Beans technológiával Programozási konvenciók gyűjteménye.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Bevezetés a Java programozásba
1 Fejlett Programozási Technikák 2. 15/6. Fejlett Programozási Technológiák 2. 2 Közhírré tétetik Március 10.-én tól TIK I. Előadó MS RoadShow 

STÍLUSOK Tulajdonságok és értékek. Színek megadási módjai H1 {color: #CCF150} H1 {color: rgb(204,241,80)} H1 {color: rgb(80%,95%,30%)} H1 {color: red}
Grafika a programban Készítette: Pető László. Bevezetés Valójában nem a célobjektumra rajzolunk, hanem annak festővászon területére (canvas). Csak olyan.
Az objektum-orientált tervezési alapelvek kritikai vizsgálata
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
A Java programozási nyelvSoós Sándor 1/16 Java programozási nyelv 6. rész – Java a gyakorlatban Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
Java programozási nyelv 3. rész – Osztályok I.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Haladó Programozás Eseménykezelés ismétlés Névtelen metódusok (anonymous methods)
Csomagok.
Kivételkezelés.
Számítógépes Grafika 2. gyakorlat Programtervező informatikus (esti) 2011/2012 őszi félév.
III. Java környezet 9. A Java nyelvről 10. Java programfejlesztés, JDK.
VI. Konténerek 18. Tömbök 19. Rendezés, keresés, karbantartás
Gábor Dénes Főiskola (IAI)A programozás alapjai (Java) - V. / 1 16.Objektumok, karakterláncok, csomagolók 17.Osztály készítése.

Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
1 Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
V. Adatszerkezetek, kollekciók
Programozási technológia
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Delphi Készítette: Rummel Szabolcs Elérhetőség:
Web-grafika II (SVG) 1. gyakorlat
Web-grafika II (SVG) 5. gyakorlat Kereszty Gábor.
Java programozási nyelv Filekezelés
Komoróczy Tamás 1 Java programozási nyelv Stringek.
Java programozási nyelv Adatbekérés konzolról
Programozás III GAFIKA.
Programozás III SWING. SWING ALKALMAZÁSOK (ISM.) Swing felületű, eseményvezérelt alkalmazás létrehozása: 1.JFrame alapú osztály létrehozása Szerepe: vezérlés.
Számítógépes Grafika 4. gyakorlat Programtervező informatikus (esti)‏ 2009/2010 őszi félév.
Vizualizáció és képszintézis Sugárkövetés (Dart + GLSL) Szécsi László.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 1. gyakorlat.
Weboldalba ágyazott interaktív feladatok GeoGebra módra Papp-Varga Zsuzsanna ELTE IK Média- és Oktatásinformatika Tanszék
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Windows Forms alkalmazás készítése Czigléczky Gábor 2009.
Programozás III SWING. SWING ALKALMAZÁSOK (ISM.) Swing felületű, eseményvezérelt alkalmazás létrehozása: 1.JFrame alapú osztály létrehozása Szerepe: vezérlés.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Appletek A Java nyelv elsődleges számú reklámja
Fejlett Programozási Technikák 2.
Alkalmazásfejlesztés gyakorlat
Fejlett Programozási Technikák 2.
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Java Programozás 3. Gy: Java GUI Swing, AWT B IT M A N v:
B M Java Programozás 7. Gy: Java alapok IT A N Adatkezelő 3.rész
B M Java Programozás 1. Gy: Java alapok IT A N Ismétlés ++
B M Java Programozás 6. Gy: Java alapok IT A N Adatkezelő 2.rész
B M Java Programozás 5. Gy: Java alapok IT A N Adatkezelő 1.rész
B M Java Programozás 8. Gy: Java alapok IT A N Adatkezelő 4.rész
Java alkalmazások 10. Előadás.
Előadás másolata:

II. Grafikus felhasználói interfész 5. A felhasználói interfész felépítése 6. Elrendezésmenedzserek 7. Eseményvezérelt programozás 8. Swing-komponensek 9. Grafika, képek 10. Alacsony szintű események Belső eseménykezelés, komponensgyártás Applet

II. Grafikus felhasználói interfész 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 5. Pont, méret, téglalap 6. Koordinátarendszer 7. Szín, betű 8. Az absztrakt JComponent osztály 9. Container osztály 10. java.awt.Window osztály 11. JFrame osztály

Komponensek tulajdonosi hierarchiája :JPanel :JMenuBar :JFrame :JLabel :JButton :JTextField :JTextArea :JCheckBox :JScrollbar :JComboBox :JList :ButtonGroup :JRadioButton :JWindow contentPane :JDialog Komponensek tulajdonosi hierarchiája Konténer komponens Vezérlő komponens

Tulajdonosi hierarchia 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

AWT és Swing java.awt javax.swing 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.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 java.awt javax.swing

java.awt java.lang.Object +--FlowLayout +--GridLayout +--BorderLayout +--java.util.EventObject | +--AWTEvent | + ... +--Point +--Dimension +--Rectangle +--Polygon +--Font +--Color +--Graphics +--Image java.lang.Object +--Component | +--Label | +--Button | +--... | +--Container | | +--Panel | | | +--Applet | | +--Window | | | +--Frame | | | +--Dialog java.awt

javax.swing Object +--Component | +--Container | | +--Panel | | | +--Applet | | | | +--JApplet | | +--Window | | | +--JWindow | | | +--Frame | | | | +--JFrame | | | +--Dialog | | | | +--JDialog | | +--JComponent | | | + ... +--ButtonGroup +--ImageIcon +--Timer JComponent +--JLabel +--AbstractButton | +--JButton | +--JToggleButton | | +--JCheckBox | | +--JRadioButton | +--JMenuItem | | +--JCheckBoxMenuItem | | +--JRadioButtonMenuItem | | +--JMenu +--JMenuBar +--JComboBox +--JTextComponent | +--JTextField | +--JTextArea +--JList +--JScrollBar +--JScrollPane +--JPanel +--JColorChooser +--JOptionPane javax.swing

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. lbInfo fr btNemOk btOk

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) fr:JFrame lbInfo:JLabel :FlowLayout btOk:JButton btNemOk:JButton FrameTest1 main cp:JPanel setLayout(new FlowLayout()) add(lbInfo) add(btOk) add(btNemOk) Együttműködési diagram

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);

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

2. megoldás – Keret összerakása belülről SpecFrame() :SpecFrame lbInfo:JLabel :FlowLayout btOk:JButton btNemOk:JButton FrameTest2 main cp:JPanel setLayout(new FlowLayout()) add(lbInfo) add(btOk) add(btNemOk) setTitle("Frame teszt") setBounds(100,50,300,100) cp = getContentPane() setVisible(true), setD.CloseOp.(...) Együttműködési diagram

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");

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

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

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()

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 téglalap méretét (szélességét és magasságát) 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)

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 pontsoro-zat összes pontját!

public class PontTegla { public static void main (String args[]) { import java.awt.*; public class PontTegla { public static void main (String args[]) { Rectangle r1 = new Rectangle(100,100,50,30); Rectangle r2 = new Rectangle(); r2.setLocation(120,80); r2.setSize(20,60); Rectangle kozos = r1.intersection(r2); System.out.println("Közös: "+kozos); Point p = new Point(130,110); kozos r1 r2 p nagy

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()); }

Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize(); Koordinátarendszer screenSize.width=1024 y x (0,0) screenSize.height=768 A képernyő bal alsó sarka: (1023,767) Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();

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

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, ...

Színek, betűk használata 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);

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

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

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)

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()

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()

Gyerekkomponensek Elrendezés 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()

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()

Metódusok (folyt.) Aktív ablak 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.

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

Jellemzők Metódusok String title Image iconImage MenuBar menuBar boolean resizable int state Metódusok Container getContentPane() setDefaultCloseOperation(int operation) static Frame[] getFrames()

II. Grafikus felhasználói interfész 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

Elrendezésmenedzserek konténer :Container komponens1 layoutManager :LayoutManager 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

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()

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és- menedzsere

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

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(); ...

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ése- kor változik Komponensek közötti konstans távolság vízszintesen(hgap) és függőlegesen(vgap)

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! hgap=20 vgap=10

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();

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

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!

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(); } …

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

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 pnSzulev pnGomb szemelyPanel (kitölti a keretet)

Tulajdonosi hierarchia :FlowLayout :SzemelyPanel pnNev: JPanel :GridLayout pnSzulev: JPanel :JLabel btOk :JButton btCancel tfNev :JTextField tfSzulev :SzemelyBevitel contentPane:JPanel pnGomb: JPanel

II. Grafikus felhasználói interfész 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

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)

PittyegoKeret:ActionListener Együttműködési diagram PittyegoKeret:ActionListener btPittyeg:JButton actionPerformed(ev) Figyelőobjektum (keret) Forrásobjektum (gomb) addActionListener(this) ev:ActionEvent Osztálydiagram «interfész» ActionListener +actionPerformed(ev:ActionEvent) PittyegoKeret +PittyegoKeret() +main(args:String[]) JButton +addActionListener(l:ActionListener) Component JFrame

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(); }

public void actionPerformed (ActionEvent ev) { Toolkit.getDefaultToolkit().beep(); } public static void main (String args[]) { new PittyegoKeret(); } // PittyegoKeret

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ó

Eseményosztályok javax::swing::event Alacsony szintű események java::awt::event java::lang::Object java::util::EventObject Component- Event Key- Mouse- Magas szintű Container- Input- Window- Focus- Action- Adjustment- … java::awt::AWTEvent ListSelectionEvent <<interfész>> DocumentEvent

EventObject osztály AWTEvent 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()

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

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 …

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

removeActionListener() A JButton akció- és billentyűzetfigyelő lánca ... :KeyListener :ActionListener bt:JButton addActionListener() removeActionListener() addKeyListener() removeKeyListener() actionPerformed(ev) keyTyped(ev) keyPressed(ev) keyReleased(ev) ev:ActionEvent vagy ev:KeyEvent

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

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! btJobb (ActionEvent) btBal (ActionEvent) :NyomasSzamlalo (ActionListener, btBal,btJobb)

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(); }

public void actionPerformed (ActionEvent ev) { if (ev.getSource()==btBal) btBal.setText(""+ ++nBal); else btJobb.setText(""+ ++nJobb); } public static void main (String args[]) { new NyomasSzamlalo();

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)

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(); }

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();

Eseményadapterek Eseményadapter Absztrakt osztály A figyelő interfészt üres metódusokkal implementálja

Feladat – Adapterek Oldjuk meg a Az Ablak becsukása feladatot esemény- adapterrel! «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) Object

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

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();

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();