1
Grafické uživatelské rozhraní GUI event-driven programming událostmi řízené programování
2
Osnova 1. Vytváření oken – základní balíčky 2. Třída Component 3. Komponenty – atributy komponent 4. Swingové komponenty 5. Třída Container – její podtřídy - použití 6. Správci rozvržení v kontejneru 7. Zpracování událostí 8. Model delegování událostí 9. Třída AWTEvent 10. Přehled swingových komponent 11. Zprávci rozvržení - příklady
3
1. Vytváření oken - základní balíčky • základní balíčky: java.awt, javax.swing • swingové třídy – novější, avšak závisí na awt třídách • základní okno je v Javě představováno objektem třídy Window a balíčku java.awt • JFrame je však mnohem užitečnější třídou
4
• java.lang • java.awt – definuje komponentu, která je
zobrazitelným objektem (tlačítko, posuvná lišta) • java.awt – definuje komponentu, která může
obsahovat komponenty • java.awt – definuje základní okno, bez lišty a rámečku • java.awt – definuje okno s lištou titulek a
rámečkem • javax.swing – definuje rámeček s rozšířenými
možnostmi
5 import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; public class TestOkna { // object Window static JFrame okno = new JFrame("Toto JFrame("Toto je nazev okna"); public static void main( main(String[] String[] args) args) { int sirkaOkna = 400; // sirka okna v pixelech int vyskaOkna = 150; // vyska okna v pixelech okno.setBounds // nastaveni pozice okno.setBounds(50, setBounds(50, 100, sirkaOkna, // a velikosti sirkaOkna, vyskaOkna); vyskaOkna); okno.setDefaultCloseOperation okno.setDefaultCloseOperation( setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); // zobrazi okno okno.setVisible okno.setVisible( setVisible(true); true); } }
Osnova Jednoduchý příklad na vytvoření okna
6
Metoda setDefaultCloseOperation() setDefaultCloseOperation() Argument
Popis co nastane při uzavření okna
EXIT_ON_CLOSE
Uzavření okna a uvolnění všech jeho zdrojů, ukončení aplikace.
DISPOSE_ON_CLOSE
Zrušení rámu a všech komponent, které obsahuje, ale neukončení aplikace.
DO_NOTHING_ON_CLOSE Operace uzavření je neúčinná. HIDE_ON_CLOSE
Okno se pouze skryje voláním metody setVisible(false). Možno později okno opět zobrazit s metodou setVisible(true).
7
2. Třída Component (Komponenta) • Komponenta je libovolný objekt třídy, která je potomkem třídy Component. • Představuje grafický útvar, který může být zobrazen na obrazovce.
8
Třída Component a její podtřídy Component
Container
Panel
Applet
Window
JComponent
Frame Dialog
JApplet
JFrame
JDialog
9
Podtřídy třídy Component Třída
Popis
JFrame
Použití jako základní aplikační okno. Vlastní třída bývá podtřídou JFrame. Dají se přidat další GIU komponenty a také využít pro kreslení.
JDialog
Použití pro dialog s uživatelem.
JApplet
Základní třída pro applety – programy běžící vnořené do webové stránky.
JComponent Podtřídy této třídy definují řadu standardních komponent jako nabídky (menu), tlačítka, zaškrtávací políčka atd.
10
Okenní plochy • Okenní plochy jsou kontejnerové objekty, které představují oblast okna • Existuje jich několik typů: – JRootPane – plocha pod titulkovací lištou, odpovídá objektu JFrame – JLayeredPane – řídí listu nabídek (menu) – JInternalPane – objektem této třídy je contentPane představující vlastní plochu okna – metody: getRootPane(), getLayeredPane(), getContentPane()
11
3. Komponenty - atributy komponent • atributy, které se dědí od tříd Component a Container • Komponenta uvnitř jiné komponenty – vnější objekt se nazývá rodič – metoda getParent() • žádný rodič neexistuje – metoda vrací null
12
Atributy komponent • Poloha – (x, y) souřadnice, kde se objekt nachází v závislosti na svém kontainetovém objektu
• Jméno – uloženo v objekty typu String • Velikost – šířka a výška objektu • Barva popředí a pozadí – barvy použity při zobrazení objektu
• Font – použit při zobrazení textu • Kurzor – definuje vzhled kurzoru při práci s objektem • Viditelnost objektu – neviditelný objekt není vykreslen isVisible(), setVisible(true / false)
13
Atributy komponent - pokračování • Platnost objektu (validace) – objekt není platný, nebylo – li určeno uspořádání objektů, které ho tvoří. U neplatného objektu je změněn jeho obsah. Nejdříve se musí validovat. isValid()
• Povolení objektu – je-li komponenta povolena má stav true a má běžný vzhled. Je-li zakázána, je zastíněna šedou barvou, ale může vyvolat událost. isEnabled(), setEnabled(true / false)
14
Velikost a umístění komponenty Metoda
Popis
void setBounds(int x, int y, int sirka, int vyska)
Nastaví polohu (x, y) a velikost – šířka, výška objektu typu Component
void setBounds(Rectangle obdelnik)
Nastaví polohu a velikost objektu typu Component na hodnoty Rectangle(x , y, s, v) x, y - poloha, s, v - velikost
Rectangle getBounds()
Vrací polohu a velikost objektu typu Component
void setSize(Dimension d)
Dimension(width, height) – šířka a výška nastaví velikost na udané hodnoty
Dimension getSize()
Vrací aktuální velikost typu Component
15
Velikost a umístění komponenty Metoda
Popis
void setLocation(int x, int y)
Nastaví polohu komponenty na souřadnice definované v argumentech metody
void setLocation(Point p)
Nastaví polohu komponenty na souřadnice bodu p
Point getLocation()
Vrací polohu objektu typu Component jako objekt typu bod – point.
16 import javax javax.swing. .swing.JFrame .swing.JFrame; JFrame; import java. java.awt. awt.Toolkit; Toolkit; import java. java.awt. awt.Dimension; Dimension; public class TestOkno1 { // object aWindow static JFrame aWindow = new JFrame("T JFrame("Toto ("Toto je moje okno"); okno"); public static void main( main(String[] String[] args) args) { Toolkit theKit = aWindow. aWindow.getToolkit(); getToolkit(); // ziska sadu nastroju // ziska velikost obrazovky Dimension wndSize = theKit. theKit.getScreenSize(); getScreenSize(); // Set the position to screen center & size to half screen size aWindow. // Pozice aWindow.setBounds( setBounds(wndSize. wndSize.width/4, width/4, wndSize. wndSize.height/4, height/4, Pozice wndSize. wndSize.width/2, width/2, wndSize. wndSize.height/2); height/2); // Velikost aWindow. aWindow.setDefaultCloseOperation( setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); // Zobrazi okno aWindow. aWindow.setVisible( setVisible(true); true); } }
Osnova Objektem třídy Toolkit můžeme měnit velikost a polohu okna na obrazovce
17
Vizuální vlastnosti komponenty • vzhled komponenty je daný: – reprezentací komponenty vytvořenou kódem ve třídě komponenty, který se provede při zobrazení komponenty – tím co na komponentu nakreslíme
• na komponentu můžeme nakreslit pomocí její metody paint() – je volána automaticky při vykreslení komponenty • nutné pouze zastínit (override) – znovu deklarovat metodu paint()
18
Metody pro vizualizaci komponenty Metoda
Popis
void setBackground (Color barva)
Nastaví barvu pozadí na barva.
Color getBackground()
Vrátí aktuální barvu pozadí.
void setForeground(Color Nastaví barvu popředí na barva. Barva popředí – barva) popisy, texty. Color getForeground()
Vrátí aktuální barvu popředí.
void setCursor(Cursor kurzor)
Nastaví komponentu kurzor na daný tvar.
void setFont(Font font)
Nastaví font písma na font.
Font getFont()
Vrací aktuální font písma.
19
Základní barvy • Barva obrazovky – objekt třídy Color • kombinace červené, zelené a modré RGB • Standardní barevné konstanty: – WHITE, LIGHT_GRAY, GRAY, DARK_GRAY, BLACK, – RED, ORANGE, YELLOW, GREEN, PINK, MANGETA, CYAN, BLUE
• tatoBarva.brighter(); tatoBarba.darker();
20 import import import import import
javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; java. java.awt. awt.Toolkit; Toolkit; java. java.awt. awt.Dimension; Dimension; java. java.awt. awt.Color; Color; java. java.awt. awt.Cursor; Cursor;
public class TestOkno2 { // object okno static JFrame okno = new JFrame("Toto JFrame("Toto je moje okno"); public static void main( main(String[] String[] args) args) { Toolkit theKit = okno.getToolkit // Get the window toolkit okno.getToolkit(); getToolkit(); Dimension wndSize = theKit. theKit.getScreenSize(); getScreenSize(); // Get screen size // Set the position to screen center & size to half screen size okno.setBounds // Position okno.setBounds( setBounds(wndSize. wndSize.width/4, width/4, wndSize. wndSize.height/4, height/4, wndSize. wndSize.width/2, width/2, wndSize. wndSize.height/2); height/2); // Size okno.setDefaultCloseOperation okno.setDefaultCloseOperation( setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); okno.setCursor okno.setCursor( setCursor(Cursor. Cursor.getPredefinedCursor( getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); Cursor.CROSSHAIR_CURSOR)); okno.getContentPane okno.getContentPane(). Color.PINK); getContentPane().setBackground ().setBackground( setBackground(Color.PINK); okno.setVisible // Display the window okno.setVisible( setVisible(true); true); } }
Osnova
21
4. Swingové komponenty • mají základ ve třídě JComponent, která vznikla ze třídy Component přidáním následujících možností: – podpora pro zapojitelný vzhled (pluggable look and feel), který umožňuje uzpůsobit (customize) komponenty potřebám uživatele, – podporu pro bublinkovou nápovědu, – podporu pro urychlující klávesy (shortcut keys) , – snadné rozšíření tříd pro vytváření vlastních komponent.
• JComponent podporuje navíc lehké procesy (lightweight)
22
Tlačítka • JButton – klasické tlačítko • JCheckBox – zaškrtávací tlačítka • JRadioButton – radiová tlačítka – použito pouze jedno
23
Nabídky - menu • Objekt typu JMenuBar – definuje nabídkovou lištu – nahoře • Objekt typu JMenu – představuje nabídkovou položku první úrovně, která se po kliknutí rozvine do seznamu nabídkových položek • Třída PopupMenu – definuje kontextovou nabídku, která se objeví po kliknutí pravého tlačítka myši
24
Textové komponenty • Komponenta JLabel – pasivní, nereaguje na vstup události, nedá se editovat • JTextField – podobně jako JLabel (řádek textu) ale editovatelná • JFormatedTextField – podobně jako JTextField, ale umožňuje formátování např. datum • JTextArea – umožňuje editování víceřádkového textu (automatické posuvníky) • JEditorPane – podporuje editování prostého textu • JTextPane – navíc vkládání obrázků a jiných komponent
25
Ostatní swingové komponenty • Třída JPanel definuje něco jako fyzický panel, použitý pro seskupení sady komponent – např. dvou oddělených skupin typu JButton
• Třída JList realizuje seznam položek, ze kterého se dá vybírat • Třída JTable realizuje tabulku položek, ze kterých se dá vybírat řádek, nebo sloupec nebo jedna položka. Komponenta provádí automaticky změnu pořadí sloupců při přetažení myší.
26
5. Třída Container, její podtřídy – použití • Kontejner je jakákoli komponenta, která je podtřídou třídy Container (abstraktní třída). • Vlastnost: možnost obsahovat jiné komponenty • Kontejner nemůže obsahovat objekt třídy Window, pouze objekty podtříd třídy Container. • Dialogové okno může např. obsahovat objekt typu JList a objekty typu JCheckbox a JButton. Na rozmístění vnitřních komponent se používá správce rozmístění (Layout Manager).
Základní metody definované ve třídě Container Metoda
Popis
int getComponentCount()
Vrací počet komponent obsažených v aktuální komponentě.
Component getComponent(int index)
Vrací komponentu určenou indexem – od 0 do n-1, jinak výjimka ArrayIndexOutOfBoundsException
Component[] getComponents()
Vrací pole všech komponent v aktuálním kontejneru
27
28
Přidávání komponent do kontejneru • Přidání komponenty do kontejneru neodstraní žádnou z již přítomných komponent. Ty se posunou v případě přidání komponenty na konkrétní místo určené indexem. • Jedna komponenta může být jen v jednom kontejneru. • Přidá-li se komponenta z jednoho kontejneru do jiného, je v původním kontejneru odstraněna.
29
Přidávání komponent do kontejneru Metoda
Popis
Component add ( Component c)
Přidá komponentu c na konec seznamu komponent uložených v kontejneru. Vrácená je komponenta c.
Component add ( Component c, int index)
Přidá komponentu c na pozici indexu. Je-li index -1, přidá komponentu na konec seznamu. Vrácená hodnota je c.
void add(Component c, Object omezeni)
Přidá komponentu c na konec seznamu komponent uložených v kontejneru. Také informuje správce rozvržení, aby přidal komponentu do rozvržení s použitím argumentu omezení.
void add(Component c, Object omezeni, int index)
Přidá komponentu c do seznamu komponent v kontejneru do pozice určené indexem a polohy určené omezením.
6. Správce rozvržení v kontejneru Layout Manager • Správce rozvržení určuje způsob, jakým jsou komponenty v kontejneru uspořádány. • Všechny kontejnery mají implicitní správce rozvržení – možnost ale zvolit i jiné správce rozvržení.
30
31
Správce rozvržení Správce rozmístění
Popis
FlowLayout
Umisťuje komponenty v po sobě jdoucích řádcích v kontejneru – podobně jako textový editor, na konci přejde na nový řádek. Implicitní pro JPanel (vhodný pro JButton)
BorderLayout Umisťuje komponenty do 5 oblastí: sever, jih, východ, západ a střed. Implicitní pro: JFrame, JDialog a JApplet CardLayout
Umisťuje komponenty v kontejneru jednu na druhou, jako v balíčku karet. Viditelná je pouze ta nahoře.
GridLayout
Rozmisťuje komponenty v kontejneru do obdelníkové mřížky s vámi zadaným počtem řádků a sloupců.
32
Správce rozvržení Správce rozmístění
Popis
GridBagLayout
Rozvržení komponent do řádků a sloupců s různou délkou. Správce poskytuje značnou flexibilitu co se týče místa v němž jsou komponenty v kontejneru rozmístěny.
BoxLayout
Rozvržení komponent do řádku nebo do sloupce. Komponenty jsou, je-li to nutné oříznuty, a ne přemístěny do dalšího řádku nebo sloupce. Správce implicitní pro kontejnerovou třídu Box.
SpringLayout
Umožňuje zadání polohy komponenty pomocí „pružin“ (springs) připevněných k hraně kontejneru nebo k další komponentě v kontejneru.
33
Správce rozvržení v kontejneru • Třidy BoxLayout, SpringLayout a Box jsou definovány v balíčku java.swing, ostatní třídy jsou definovány v balíčku java.awt. • Správci automaticky upravují komponenty tak, aby zapadly do dostupného prostoru. • Při pevné velikosti a poloze všech komponent může dojít k jejich překrývání nebo vytlačování při zmenšení plochy obrazovky.
34
Správce rozvržení v kontejneru • změna správce rozvržení: FlowLayout tok = new FlowLayout(); okno.getContentPane().setLayout(tok);
35
Osnova
import javax javax.swing. .swing.JFrame .swing.JFrame; JFrame; import javax.swing. javax.swing.JButton .swing.JButton; JButton; import import import import
java. java.awt. awt.Toolkit; Toolkit; java. java.awt. awt.Dimension; Dimension; java. java.awt. awt.Container; Container; java. java.awt. awt.FlowLayout; FlowLayout;
public class TryFlowLayout { // The window object static JFrame aWindow = new JFrame(" JFrame("This ("This is the Window Title"); Title"); public static void main( main(String[] String[] args) args) { Toolkit theKit = aWindow. aWindow.getToolkit(); getToolkit(); Dimension wndSize = theKit. theKit.getScreenSize(); getScreenSize();
// Get the window toolkit // Get screen size
// Set the position to screen center & size to half screen size aWindow. // Position aWindow.setBounds( setBounds(wndSize. wndSize.width/4, width/4, wndSize. wndSize.height/4, height/4, wndSize. wndSize.width/2, width/2, wndSize. wndSize.height/2); height/2); // Size aWindow. aWindow.setDefaultCloseOperation( setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); FlowLayout flow = new FlowLayout(); FlowLayout(); // Create a layout manager //FlowLayout //FlowLayout flow = new FlowLayout( FlowLayout(FlowLayout.LEFT); FlowLayout.LEFT); //FlowLayout //FlowLayout flow = new FlowLayout( FlowLayout(FlowLayout.LEFT, FlowLayout.LEFT, 20, 30);
36 Container content = aWindow. aWindow.getContentPane(); getContentPane(); // Get the content pane content. // Set the container layout mgr content.setLayout( setLayout(flow); flow); // Pridani sesti tlacitkovych komponent for( for(int i = 1; i <= 6; i++) content. content.add( add(new JButton(" JButton("Press ("Press " + i)); // Add a Button to content // pane aWindow. aWindow.pack(); pack(); aWindow. aWindow.setVisible( setVisible(true); true); } }
// Display the window
Osnova
37
7. Zpracování událostí (events) •
Příklad knihovna: chci knihu, která je půjčena 1. chodím se dotazovat, zde není k dispozici (dotazování – polling) 2. použití vzoru Observer (Publisher/Subscriber – vydavatel/odběratel), který informuje o změnách v dostupnosti konkrétně daných knih
• •
Model pozorovatele je efektivnější a zprávu o vzniklé situaci poskytne prakticky okamžitě. Z toho principu je odvozen model událostmi řízeného programování
38
Zpracování událostí (events) • konzolové programy a programy využívající okna • u konzolového programu jeho kód rozhoduje o pořadí událostí – vše je dopředu určeno • chod programu využívajícího okna je určen tím, co uživatel udělá v grafickém rozhraní – výběr položek menu, tlačítek … způsobí odpovídající akce programu (event-driven-programming)
39
Událostmi řízené programy • Moderní systémy s okny využívají model událostmi řízeného programování. • V tomto modelu má aplikace typicky prostředky GUI (kliknutí na tlačítko, výběr položky z menu atd.) k interakci s uživatelem. • Uživatelem vytvářené (generované) akce vytváří (generují) události. • Při každé takové události se vytvoří objekt události (event object). • Systém ukládá tyto události do fronty a pak je zasílá speciálním metodám nazývanými ovladače událostí. Argumentem uvedené metody je objekt události.
40
Událostmi řízené programy • Metoda ovladače události (event handler) je tzv. call back metoda což znamená, že tuto metodu vytvoří programátor, ale je volaná systémem (odtud volání zpět – call back). • Mnoho z událostí je vytvořeno uživatelem, ale jiné události mohou být vytvořeny také systémem.
41
Událostmi řízené programy • Procesu zpracování událostí se říká událostní smyčka (event loop). • V této smyčce pracuje systém a očekává události. Pokud nějaké nastanou, tak je zpracuje a opět čeká ve smyčce na další události – na podobném principu např. pracuje operační systém UNIX. • Fragment kódu této smyčky může být:
42
Osnova while ( theApp. theApp.isRunning() isRunning() ) { Event e = nextEvent(); // zí nextEvent(); získá ská novou udá událost z fronty udá událostí lostí int id = e.getId e.getId(); getId(); switch( switch( id ) { case Event_ Event_MouseClick; MouseClick; theApp. theApp.handleMouseClick(); handleMouseClick(); break; break; case Event_Mouse_ Event_Mouse_Move _Mouse_Move; Move; theApp. theApp.handleMouseMove(); handleMouseMove(); break; break; case Event_ Event_ButtonPush; ButtonPush; theApp. theApp.handleButtonPush(); handleButtonPush(); break; break; case Event_ Event_KeyPush; KeyPush; theApp. theApp.handleKeyPush(); handleKeyPush(); break; break; // . . . další další udá události default: ignoreEvent(e); ignoreEvent(e); break; break; } }
Po spuštění aplikace se tato v tzv. inicializační fázi. Po skončení této fáze se aplikace dostává do smyčky, ve které čeká na událost (event loop).
43
Model delegování událostí • Hlavní části tohoto modelu jsou: – Zdroj události (event source) – Posluchač události (event listener) – Objekt události (event object)
• Zdroj události (event source) je objekt jako např. tlačítko, posuvník, který může generovat události. • Zdroj události má metodu, která dovoluje jiným objektům, aby byly registrováni jako posluchači. • To znamená jako objekty, které jsou uvědoměny, když nastala událost, kterou sledují (poslouchají).
44
Model delegování událostí • Např. metoda addActionListener() je metoda, která se používá k registraci posluchačů, kteří sledují kliknutí na tlačítko. • Posluchač události (event listener) je objekt (Observer), který sleduje, zda-li nenastala událost. • Když zdroj události vytvoří (generuje) událost, registrovaní posluchači jsou o tom uvědoměni, když systém vyvolává odpovídající call-back metodu zapouzdřenou v posluchači.
45
Model delegování událostí • Např. již zmíněný posluchač události pro kliknití na tlačítko by implementoval odpovídající callback metodu , v tomto případě callback metodu actionPerformed() deklarovanou v rozhraní ActionListener. • Když uživatel klikne na tlačítko, metoda actionPerformed() posluchače je volána, aby zpracovala tuto událost.
46
Model delegování událostí • Objekt události (event object) je objekt, který je předán jako argument call-back metodě posluchače. • Např. již zmíněná metoda actionPerformed() má následující notaci: public void actionPerformed( ActionEvent e );
Tato metoda využívá argument e typu ActionEvent k získání dalších informací týkající se události, tedy identifikace objektu, který událost způsobil.
47
Model delegování událostí • Model delegování událostí je pružný a dovoluje, aby libovolný objekt byl registrovaný jako posluchač pro různé typy událostí. • Zdroje událostí takto delegují zpracování generované (vytvořené) události na odpovídající call-back metodu, která je uvedena (zapouzdřena) uvnitř posluchače. • Objekt vedený jako posluchač musí implementovat odpovídající rozhraní posluchače.
48
Model delegování událostí • V následující tabulce je uveden seznam typů událostí v balíčku java.awt.event spolu s korespondujícími posluchači (jejich rozhraními) a callback metodami deklarovanými v odpovídajících rozhraních.
49
Událost, posluchač, metoda zpětného volání Třída události (Event class) ActionEvent AdjustmentEvent ComponentEvent
Rozhraní posluchače (Listener interface) ActionListener AdjustmentListener ComponentListener
ContainerEvent
ContainerListener
FocusEvent
FocusListener
ItemEvent MouseEvent
ItemListener MouseListener
MouseMotionListener TextEvent WindowEvent
TextListener WindowListener
Metoda callback (Listener callback) actionPerformed() adjustmentValueChanged() componentHidden() componentMoved() componentResized() componetShown() componentAdded() componentRemoved() focusGained() focusLost() itemStateChanged() mouseClicled() mouseEntered() mousePressed() mouseReleased() mouseDrag() mouseMoved() textValueChanged() windowActivated() windowClosed() windowClosing() windowDeactivated() windowDeiconified() windowIcinified() windowOpened()
50 import import import import import import
java. java.awt. awt.FlowLayout; FlowLayout; java. java.awt. awt.event. event.ActionListener; ActionListener; java. java.awt. awt.event. event.ActionEvent; ActionEvent; javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; javax.swing. javax.swing.JButton .swing.JButton; JButton; javax.swing. javax.swing.JOptionPane .swing.JOptionPane; JOptionPane;
public class ButtonFrame extends JFrame { private JButton tlacitkoStart; tlacitkoStart; // tlacitko s textem private JButton tlacitkoStop; tlacitkoStop; // ButtonFrame prida JButtons do JFrame public ButtonFrame() ButtonFrame() { super( "Testová "Testování tlač tlačítek" ); setLayout( setLayout( new FlowLayout() FlowLayout() ); // nastaveni spravce rozvrzeni tlacitkoStart = new JButton( JButton( "Start" ); add( add( tlacitkoStart ); // prida tlacitkoStart do kontejneru JFrame tlacitkoStop = new JButton( JButton( "Stop"); add( add( tlacitkoStop ); // vytvoreni noveho ovladace ButtonHandler pro zpracovani udalosti // tlacitek ButtonHandler handler = new ButtonHandler(); ButtonHandler();//d deklarovaná třída ();//dá //dále deklarovaná tlacitkoStop. tlacitkoStop.addActionListener( addActionListener( handler ); tlacitkoStart. tlacitkoStart.addActionListener( addActionListener( handler ); } // konec ButtonFrame konstruktoru
Osnova
51 // vnitrni trida pro zpracovani udalosti tlacitek // ButtonHandler – naslouchací naslouchací objekt tlač tlačítka private class ButtonHandler implements ActionListener { // zpracuje udalost tlacitka public void actionPerformed( ActionEvent udalost ) { JOptionPane. JOptionPane.showMessageDialog( showMessageDialog( ButtonFrame. ButtonFrame.this, this, String. String.format( format( "Stiskli jste: %s", udalost.getActionCommand udalost.getActionCommand() getActionCommand() ) ); } // konec metody actionPerformed } // konec soukrome vnitrni tridy ButtonHandler } // konec tridy ButtonFrame
Osnova
52 import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; public class ButtonTest { public static void main( main( String args[] args[] ) { ButtonFrame buttonFrame = new ButtonFrame(); ButtonFrame(); // vytvoreni instance buttonFrame. buttonFrame.setDefaultCloseOperation( setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE JFrame.EXIT_ON_CLOSE ); buttonFrame. buttonFrame.setSize( setSize( 275, 110 ); // nastaveni velikost okna buttonFrame. buttonFrame.setVisible( setVisible( true ); // zobrazeni okna } }
Osnova
53
Třídy událostí • Nízkoúrovňové události: – události vycházející z klávesnice, myši a události spojené s provozem okna – minimalizace, uzavření. – Význam událostí: myš byla přesunuta, okno bylo zavřeno, klávesa byla stlačena
• Sémantické události: – specifické události spojené s komponentou jako: stisk tlačítka k nastartování nějaké programové akce, posunutí posuvníku – Význam událostí: tlačítko OK stlačeno, položka menu vybrána
Třídy pro nízkoúrovňové události balíček java.awt.event Událost
Popis
FocusEvent
Objekty třídy představují události, které vznikají, když komponenta získá / ztratí fokus.
MouseEvent
Objekty třídy představují události, které jsou výsledkem akcí uživatele s myší – pohyb, stisknutí tlačítka.
KeyEvent
Objekty třídy představují události, které vznikají stisknutím tlačítka klávesnice.
WindowEvent Objekty třídy představují události, které se vztahují k oknu – zmenšení, zavření okna.
54
55
9. Třída AWTEvent • je podtřídou třídy java.util.EventObject • třída EventObject implementuje rozhrani Serializable, – tedy všechny objekty tříd událostí jsou serializovatelné – definuje metodu getSource(), která vrací objekt, který je zdrojem události – jako odkaz na typ Object – všechny třídy událostí dědí tuto metodu
56
Třída AWTEvent • Třída AWTEvent definuje konstanty, které představují různé události. • Konstanty mají identifikátory tvořené jménem události – za tím následuje _MASK • Každá z konstant je hodnotou typu long s jedním nastaveným bitem (ostatní bity 0) – umožňuje kombinaci událostí s logickými operátory or, and • Např. MOUSE_EVENT_MASK, WINDOW_FOCUS_EVENT_MASK …
57
Třída AWTEvent • Identifikátory událostí se používají k povolení určité skupiny události v objektu komponenty • to se provede zavoláním metody enableEvents() a předáním proměnné pro událost, která má být povolena • dělá se pouze, když se nepoužívá přijímač (Listener). Zaregistrováním přijímače se automaticky povolí události, které je přijímač schopen slyšet.
58
Sémantické události • týkají se operací s komponentami GUI programu aplikace • např. výběr položky z nabídky, nebo kliknutím na tlačítko … • tří třídy představují základní sémantické události – jsou podtřídami od AWTEvent třídy EventObject
AWTEvent
ActionEvent
ItemEvent
AdjustmentEvent
59
Sémantické události
Typ události
Generované objekty typu
ActionEvent
Tlačítka: JButton, JToggleButton, JCheckBox Nabídky: JMenuItem, JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem Text: JTextField
ItemEvent
Tlačítka: JButton, JToggleButton, JCheckBox Nabídky: JMenuItem, JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem
AdjustmentEvent JScrollbar
Zpracování sémantických událostí pomocí posluchačů - Listeners
60
• Každé z naslouchacích rozhraní definuje pouze jednu metodu, není třeba vytvářet odpovídající adaptery
Naslouchací rozhraní
Metoda
ActionListener
void actionPerformed(ActionEvent e)
ItemListener
void itemStateChanged(ItemEvent c)
AdjustmentListener void adjustmentValueChanged(AdjustmentEvent e)
Třída událostí ActionEvent rozhraní ActionListener • Instance třídy ActionEvent je zaslána všem registrovaným posluchačům po každé aktivaci tlačítka • Metoda getActionCommand() vrací „příkazový řetězec“ co bývá popisek přiřazený k tlačítku, který událost generuje • Rozhraní ActionListener definuje jen metodu actionPerformed()
61
62
Jednoduchý čítač • část model • část view a controller • aplikace
63 public class Counter { private int cnt = 0; public void incr() incr() { cnt++; cnt++; } public void decr() decr() {cnt {cnt-cnt--; --; } public void clr() clr() {cnt {cnt = 0; } public int getCnt() getCnt() {return {return cnt; cnt; } }
Osnova
64 import import import import import import import
java. java.awt. awt.FlowLayout; FlowLayout; java. java.awt. awt.event. event.ActionListener; ActionListener; java. java.awt. awt.event. event.ActionEvent; ActionEvent; javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; javax.swing. javax.swing.JTextField .swing.JTextField; JTextField; javax.swing. javax.swing.JLabel .swing.JLabel; JLabel; javax.swing. javax.swing.JButton .swing.JButton; JButton;
public class CounterFrame extends JFrame{ JFrame{ private Counter c = new Counter(); Counter(); private JButton increment, increment, decrement, decrement, clear; clear; private JTextField field; field; private JLabel label; label; public CounterFrame() CounterFrame() { super("Jenoduchý super("Jenoduchý čítač tač"); setLayout( setLayout(new FlowLayout()); FlowLayout()); label = new JLabel("Stav JLabel("Stav čítač tače: "); add( add(label); label); field = new JTextField(6); JTextField(6); field. field.setEditable( setEditable(false); false); field. field.setHorizontalAlignment( setHorizontalAlignment(JTextField.RIGHT); JTextField.RIGHT); add( add(field); field); field. field.setText( setText(String. String.valueOf(c. valueOf(c.getCnt (c.getCnt())); getCnt())); increment = new JButton(" JButton("Increment ("Increment"); Increment"); add( add(increment); increment); decrement = new JButton(" JButton("Decrement ("Decrement"); Decrement"); add( add(decrement); decrement); clear = new JButton(" JButton("Clear ("Clear"); Clear"); add( add(clear); clear);
Osnova
65 ButtonHandler handler = new ButtonHandler(); ButtonHandler(); increment. increment.addActionListener( addActionListener(handler); handler); decrement. decrement.addActionListener( addActionListener(handler); handler); clear. clear.addActionListener( addActionListener(handler); handler); } private class ButtonHandler implements ActionListener { public void actionPerformed( actionPerformed(ActionEvent event) event) { if( if(event. event.getSource()== getSource()==increment ()==increment) increment) { c.incr c.incr(); incr(); field. field.setText( setText(String. String.valueOf(c. valueOf(c.getCnt (c.getCnt())); getCnt())); } else if( if(event. event.getSource()== getSource()==decrement ()==decrement) decrement) { c.decr c.decr(); decr(); field. field.setText( setText(String. String.valueOf(c. valueOf(c.getCnt (c.getCnt())); getCnt())); } else if( if(event. event.getSource()== getSource()==clear ()==clear) clear) { c.clr c.clr(); clr(); field. field.setText( setText(String. String.valueOf(c. valueOf(c.getCnt (c.getCnt())); getCnt())); } } } }
Osnova
66 import javax javax.swing. .swing.JFrame .swing.JFrame; JFrame; public class CounterFrameTest { public static void main( main(String args[]) args[]) { CounterFrame counterFrame= counterFrame= new CounterFrame(); CounterFrame(); counterFrame. counterFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); counterFrame. counterFrame.setSize(400, setSize(400, 200); counterFrame. counterFrame.setVisible( setVisible(true); true); } }
Osnova
67
10. Přehled Swingových komponent Komponenta Popis JLabel
Zobrazuje needitovatelný text, nebo ikony
JTextField
Umožňuje uživateli vstup dat z klávesnice. Je možné také použít pro zobrazení editovatelných a needitovatelných textů.
JButton
Spouští událost kliknutím myši na tlačítko.
JCheckBox
Specifikuje volby
JComboBox
Poskytuje drop-down seznam položek pro výběr nebo doplnění.
JList
Poskytuje seznam položek pro jedno i vícenásobný výběr.
JPanel
Poskytuje oblast pro umístění a další zpracování komponent.
Text Fields a úvod do zpracování událostí s vnořenými třídami • JTextField – Jednořádková oblast do které může uživatel zadat text
• JPasswordField – je podtřídou JTextField – ukrývá znaky, které zadává uživatel (zobrazuje *)
68
69 // Demonstrating the JTextField class. class. import java. java.awt. awt.FlowLayout; FlowLayout; import java. java.awt. awt.event. event.ActionListener; ActionListener; import java. java.awt. awt.event. event.ActionEvent; ActionEvent; import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; import javax.swing. javax.swing.JTextField .swing.JTextField; JTextField; import javax.swing. javax.swing.JPasswordField .swing.JPasswordField; JPasswordField; import javax.swing. javax.swing.JOptionPane .swing.JOptionPane; JOptionPane; public class TextFieldFrame extends JFrame { private JTextField textField1; // text field with set size private JTextField textField2; // text field constructed with text private JTextField textField3; // text field with text and size private JPasswordField passwordField; passwordField; // password field with text // TextFieldFrame constructor adds JTextFields to JFrame public TextFieldFrame() TextFieldFrame() { super( "Testing "Testing JTextField and JPasswordField" JPasswordField" ); setLayout( setLayout( new FlowLayout() FlowLayout() ); // set frame layout // construct textfield with 10 columns textField1 = new JTextField( JTextField( 10 ); add( add( textField1 ); // add textField1 to JFrame // construct textfield with default text textField2 = new JTextField( JTextField( "Enter "Enter text here" here" ); add( add( textField2 ); // add textField2 to JFrame
Osnova
70 // construct textfield with default text and 21 columns textField3 = new JTextField( JTextField( "Uneditable "Uneditable text field", field", 21 ); textField3.setEditable textField3.setEditable( setEditable( false ); // disable editing add( add( textField3 ); // add textField3 to JFrame // construct passwordfield with default text passwordField = new JPasswordField( JPasswordField( "Hidden "Hidden text" ); add( add( passwordField ); // add passwordField to JFrame // register event handlers TextFieldHandler handler = new TextFieldHandler(); TextFieldHandler(); textField1.addActionListener textField1.addActionListener( addActionListener( handler ); textField2.addActionListener textField2.addActionListener( addActionListener( handler ); textField3.addActionListener textField3.addActionListener( addActionListener( handler ); passwordField. passwordField.addActionListener( addActionListener( handler ); } // end TextFieldFrame constructor // private inner class for event handling private class TextFieldHandler implements ActionListener { // process textfield events public void actionPerformed( ActionEvent event ) { String string = ""; // declare string to display // user pressed Enter in JTextField textField1 if ( event. event.getSource() getSource() == textField1 ) string = String. String.format( format( "textField1: %s", event. event.getActionCommand() getActionCommand() );
Osnova
71 // user pressed Enter in JTextField textField2 else if ( event. event.getSource() getSource() == textField2 ) string = String. String.format( format( "textField2: %s", event. event.getActionCommand() getActionCommand() ); // user pressed Enter in JTextField textField3 else if ( event. event.getSource() getSource() == textField3 ) string = String. String.format( format( "textField3: %s", event. event.getActionCommand() getActionCommand() ); // user pressed Enter in JTextField passwordField else if ( event. event.getSource() getSource() == passwordField ) string = String. String.format( format( "passwordField "passwordField: passwordField: %s", new String( String( passwordField. passwordField.getPassword() getPassword() ) ); // display JTextField content JOptionPane. JOptionPane.showMessageDialog( showMessageDialog( null, null, string ); } // end method actionPerformed } // end private inner class TextFieldHandler } // end class TextFieldFrame
Osnova
72 // Testing TextFieldFrame. TextFieldFrame. import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; public class TextFieldTest { public static void main( main( String args[] args[] ) { TextFieldFrame textFieldFrame = new TextFieldFrame(); TextFieldFrame(); textFieldFrame. textFieldFrame.setDefaultCloseOperation( setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE JFrame.EXIT_ON_CLOSE ); textFieldFrame. textFieldFrame.setSize( setSize( 325, 100 ); // set frame size textFieldFrame. textFieldFrame.setVisible( setVisible( true ); // display frame } // end main } // end class TextFieldTest
Osnova
73
Výstupy aplikace
74
Výstupy aplikace
Některé běžné rozhraní event-listener balíčku java.awt.event interface «interface» ActionListener ActionListener interface «interface» AdjustmentListener
AdjustmentListener interface «interface» ComponentListener ComponentListener interface «interface» ContainerListener ContainerListener interface «interface» FocusListener FocusListener interface «interface» EventListener EventListener
«interface» interface ItemListener ItemListener interface «interface» KeyListener KeyListener interface «interface» MouseListener MouseListener interface «interface» MouseMotionListener MouseMotionListener interface «interface» TextListener TextListener interface «interface» WindowListener TextListener
75
76
JList • Seznam (List) – – – –
Řada položek uživatel může vybrat jednu nebo více pložek Single-selection vs. multiple-selection JList
77 // Selecting colors from a JList. JList. import java. java.awt. awt.FlowLayout; FlowLayout; import java. java.awt. awt.Color; Color; import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; import javax.swing. javax.swing.JList .swing.JList; JList; import javax.swing. javax.swing.JScrollPane .swing.JScrollPane; JScrollPane; import javax.swing. javax.swing.event .swing.event. event.ListSelectionListener; ListSelectionListener; import javax.swing. javax.swing.event .swing.event. event.ListSelectionEvent; ListSelectionEvent; import javax.swing. javax.swing.ListSelectionModel .swing.ListSelectionModel; ListSelectionModel; public class ListFrame extends JFrame { private JList colorJList; colorJList; // list to display colors private final String colorNames[] colorNames[] = { "Black "Black", Black", "Blue "Blue", Blue", "Cyan "Cyan", Cyan", "Dark Gray", Gray", "Gray "Gray", Gray", "Green "Green", Green", "Light "Light Gray", Gray", "Magenta "Magenta", Magenta", "Orange", Orange", "Pink", "Red "Red", Red", "White "White", White", "Yellow "Yellow" Yellow" }; private final Color colors[] colors[] = { Color.BLACK, Color.BLACK, Color.BLUE, Color.BLUE, Color.CYAN, Color.CYAN, Color.DARK_GRAY, Color.DARK_GRAY, Color.GRAY, Color.GRAY, Color.GREEN, Color.GREEN, Color.LIGHT_GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.MAGENTA, Color.ORANGE, Color.ORANGE, Color.PINK, Color.PINK, Color.RED, Color.RED, Color.WHITE, Color.WHITE, Color.YELLOW Color.YELLOW }; // ListFrame constructor add JScrollPane containing JList to JFrame public ListFrame() ListFrame() { super( "List Test" ); setLayout( setLayout( new FlowLayout() FlowLayout() ); // set frame layout colorJList = new JList( JList( colorNames ); // create with colorNames colorJList. colorJList.setVisibleRowCount( setVisibleRowCount( 5 ); // display five rows at once
Osnova
78 // do not allow multiple selections colorJList. colorJList.setSelectionMode( setSelectionMode( ListSelectionModel.SINGLE_SELECTION ListSelectionModel.SINGLE_SELECTION ); // add a JScrollPane containing JList to frame add( add( new JScrollPane( JScrollPane( colorJList ) ); colorJList. colorJList.addListSelectionListener( addListSelectionListener( new ListSelectionListener() ListSelectionListener() // anonymous inner class { // handle list selection events public void valueChanged( valueChanged( ListSelectionEvent event ) { getContentPane(). getContentPane().setBackground ().setBackground( setBackground( colors[ colors[ colorJList. colorJList.getSelectedIndex() getSelectedIndex() ] ); } // end method valueChanged } // end anonymous inner class ); // end call to addListSelectionListener } // end ListFrame constructor } // end class ListFrame
Osnova
79 // Selecting colors from a JList. JList. import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; public class ListTest { public static void main( main( String args[] args[] ) { ListFrame listFrame = new ListFrame(); ListFrame(); // create ListFrame listFrame. listFrame.setDefaultCloseOperation( setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE JFrame.EXIT_ON_CLOSE ); listFrame. listFrame.setSize( setSize( 350, 150 ); // set frame size listFrame. listFrame.setVisible( setVisible( true ); // display frame } // end main } // end class ListTest
Osnova Aplikace
80
Výstupy aplikace
81
Multiple-Selection Lists • Multiple-selection list – Select many items from Jlist – Allows continuous range selection
82 // Copying items from one List to another. another. import java. java.awt. awt.FlowLayout; FlowLayout; import java. java.awt. awt.event. event.ActionListener; ActionListener; import java. java.awt. awt.event. event.ActionEvent; ActionEvent; import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; import javax.swing. javax.swing.JList .swing.JList; JList; import javax.swing. javax.swing.JButton .swing.JButton; JButton; import javax.swing. javax.swing.JScrollPane .swing.JScrollPane; JScrollPane; import javax.swing. javax.swing.ListSelectionModel .swing.ListSelectionModel; ListSelectionModel; public class MultipleSelectionFrame extends JFrame { private JList colorJList; colorJList; // list to hold color names private JList copyJList; copyJList; // list to copy color names into private JButton copyJButton; copyJButton; // button to copy selected names private final String colorNames[] colorNames[] = { "Black "Black", Black", "Blue "Blue", Blue", "Cyan "Cyan", Cyan", "Dark Gray", Gray", "Gray "Gray", Gray", "Green "Green", Green", "Light "Light Gray", Gray", "Magenta "Magenta", Magenta", "Orange "Orange", Orange", "Pink", "Red "Red", Red", "White "White", White", "Yellow "Yellow" Yellow" }; // MultipleSelectionFrame constructor public MultipleSelectionFrame() MultipleSelectionFrame() { super( "Multiple "Multiple Selection Lists" Lists" ); setLayout( setLayout( new FlowLayout() FlowLayout() ); // set frame layout colorJList = new JList( JList( colorNames ); // holds names of all colors colorJList. colorJList.setVisibleRowCount( setVisibleRowCount( 5 ); // show five rows colorJList. colorJList.setSelectionMode( setSelectionMode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ); add( add( new JScrollPane( JScrollPane( colorJList ) ); // add list with scrollpane
Osnova
83 copyJButton = new JButton( JButton( "Copy >>>" ); // create copy button copyJButton. copyJButton.addActionListener( addActionListener( new ActionListener() ActionListener() // anonymous inner class { // handle button event public void actionPerformed( ActionEvent event ) { // place selected values in copyJList copyJList. copyJList.setListData( setListData( colorJList. colorJList.getSelectedValues() getSelectedValues() ); } // end method actionPerformed } // end anonymous inner class ); // end call to addActionListener add( add( copyJButton ); // add copy button to JFrame copyJList = new JList(); JList(); // create list to hold copied color names copyJList. copyJList.setVisibleRowCount( setVisibleRowCount( 5 ); // show 5 rows copyJList. copyJList.setFixedCellWidth( setFixedCellWidth( 100 ); // set width copyJList. copyJList.setFixedCellHeight( setFixedCellHeight( 15 ); // set height copyJList. copyJList.setSelectionMode( setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION ListSelectionModel.SINGLE_INTERVAL_SELECTION ); add( add( new JScrollPane( JScrollPane( copyJList ) ); // add list with scrollpane } // end MultipleSelectionFrame constructor } // end class MultipleSelectionFrame
Osnova
84 // Testing MultipleSelectionFrame. MultipleSelectionFrame. import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; public class MultipleSelectionTest { public static void main( main( String args[] args[] ) { MultipleSelectionFrame multipleSelectionFrame = new MultipleSelectionFrame(); MultipleSelectionFrame(); multipleSelectionFrame. multipleSelectionFrame.setDefaultCloseOperation( setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE JFrame.EXIT_ON_CLOSE ); multipleSelectionFrame. multipleSelectionFrame.setSize( setSize( 350, 140 ); // set frame size multipleSelectionFrame. multipleSelectionFrame.setVisible( setVisible( true ); // display frame } // end main } // end class MultipleSelectionTest
Osnova
85
Výstupy aplikace
86
Mouse Event Handling • Rozhraní Event-listener pro události způsobené myší – MouseListener – MouseMotionListener – Listen for MouseEvents
Metody rozhraní MouseListener public void mousePressed( MouseEvent event ) Metoda je vyvolána, když je stisknuto tlačítko myši, zatímco kurzor myši je na komponentě. public void MouseClicked( MouseEvent event ) Metoda je vyvolána, když je stisknuto a uvolněno tlačítko myši, zatímco kurzor zůstává na komponentě. Této události vždy předchází volání mousePressed. public void mouseReleased( MouseEvent event ) Metoda je volaná, když po stisknutí je uvolněno tlačítko myši. Tuto událost vždy předchází volání mousePressed a jedno nebo více volání mouseDragged. public void mouseEntered( MouseEvent event ) Metoda je volaná, když kurzor myši navazuje spojení s komponentou. public void mouseExited( MouseEvent event ) Metoda je volaná, když kurzor myši opouští spojení s komponentou.
87
88
Metody rozhraní MouseMotionListener
public void mouseDragged( MouseEvent event ) Metoda je volaná při současném splnění: kurzor myši na komponentě, myš se posunula, tlačítko myši zůstává stisknuté. Této události vždy předchází volání metody mousePressed. Všechny události tažení jsou zaslány komponentě na niž uživatel začal táhnout myší. public void mouseMoved( MouseEvent event ) Metoda je volaná když se myš přesune a kurzor myši je na komponentě. Všechny události posunutí jsou zaslány komponentě, na níž je aktuálně umístěna myš.
89 // Demonstrating mouse events. events. import java. java.awt. awt.Color; Color; import java. java.awt. awt.BorderLayout; BorderLayout; import java. java.awt. awt.event. event.MouseListener; MouseListener; import java. java.awt. awt.event. event.MouseMotionListener; MouseMotionListener; import java. java.awt. awt.event. event.MouseEvent; MouseEvent; import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; import javax.swing. javax.swing.JLabel .swing.JLabel; JLabel; import javax.swing. javax.swing.JPanel .swing.JPanel; JPanel; public class MouseTrackerFrame extends JFrame { private JPanel mousePanel; mousePanel; // panel in which mouse events will occur private JLabel statusBar; statusBar; // label that displays event information // MouseTrackerFrame constructor sets up GUI and // registers mouse event handlers public MouseTrackerFrame() MouseTrackerFrame() { super( "Demonstrating "Demonstrating Mouse Events" Events" ); mousePanel = new JPanel(); JPanel(); // create panel mousePanel. mousePanel.setBackground( setBackground( Color.WHITE Color.WHITE ); // set background color add( add( mousePanel, mousePanel, BorderLayout.CENTER BorderLayout.CENTER ); // add panel to JFrame statusBar = new JLabel( JLabel( "Mouse outside JPanel" JPanel" ); add( add( statusBar, statusBar, BorderLayout.SOUTH BorderLayout.SOUTH ); // add label to JFrame
Osnova
90 // create and register listener for mouse and mouse motion events MouseHandler handler = new MouseHandler(); MouseHandler(); mousePanel. mousePanel.addMouseListener( addMouseListener( handler ); mousePanel. mousePanel.addMouseMotionListener( addMouseMotionListener( handler ); } // end MouseTrackerFrame constructor private class MouseHandler implements MouseListener, MouseListener, MouseMotionListener { // MouseListener event handlers // handle event when mouse released immediately after press public void mouseClicked( mouseClicked( MouseEvent event ) { statusBar. statusBar.setText( setText( String. String.format( format( "Clicked "Clicked at [%d, %d]", event. event.getX(), getX(), event. event.getY() getY() ) ); } // end method mouseClicked // handle event when mouse pressed public void mousePressed( mousePressed( MouseEvent event ) { statusBar. statusBar.setText( setText( String. String.format( format( "Pressed "Pressed at [%d, %d]", event. event.getX(), getX(), event. event.getY() getY() ) ); } // end method mousePressed // handle event when mouse released after dragging public void mouseReleased( mouseReleased( MouseEvent event ) { statusBar. statusBar.setText( setText( String. String.format( format( "Released "Released at [%d, %d]", event. event.getX(), getX(), event. event.getY() getY() ) ); } // end method mouseReleased
Osnova
91 // handle event when mouse enters area public void mouseEntered( mouseEntered( MouseEvent event ) { statusBar. statusBar.setText( setText( String. String.format( format( "Mouse entered at [%d, %d]", event. event.getX(), getX(), event. event.getY() getY() ) ); mousePanel. mousePanel.setBackground( setBackground( Color.GREEN Color.GREEN ); } // end method mouseEntered // handle event when mouse exits area public void mouseExited( mouseExited( MouseEvent event ) { statusBar. statusBar.setText( setText( "Mouse outside JPanel" JPanel" ); mousePanel. mousePanel.setBackground( setBackground( Color.WHITE Color.WHITE ); } // end method mouseExited // MouseMotionListener event handlers // handle event when user drags mouse with button pressed public void mouseDragged( mouseDragged( MouseEvent event ) { statusBar. statusBar.setText( setText( String. String.format( format( "Dragged "Dragged at [%d, %d]", event. event.getX(), getX(), event. event.getY() getY() ) ); } // end method mouseDragged // handle event when user moves mouse public void mouseMoved( mouseMoved( MouseEvent event ) { statusBar. statusBar.setText( setText( String. String.format( format( "Moved "Moved at [%d, %d]", event. event.getX(), getX(), event. event.getY() getY() ) ); } // end method mouseMoved } // end inner class MouseHandler } // end class MouseTrackerFrame
Osnova
92 // Testing MouseTrackerFrame. MouseTrackerFrame. import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; public class MouseTracker { public static void main( main( String args[] args[] ) { MouseTrackerFrame mouseTrackerFrame = new MouseTrackerFrame(); MouseTrackerFrame(); mouseTrackerFrame. mouseTrackerFrame.setDefaultCloseOperation( setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE JFrame.EXIT_ON_CLOSE ); mouseTrackerFrame. mouseTrackerFrame.setSize( setSize( 300, 100 ); // set frame size mouseTrackerFrame. mouseTrackerFrame.setVisible( setVisible( true ); // display frame } // end main } // end class MouseTracker
Osnova
93
Výstupy aplikace
94
Třídy Adapter • Třida Adapter – Implementuje rozhraní – Poskytuje standardní implementaci každé metody rozhraní – Používá se, když nejsou třeba všechny metody daného rozhraní
Třídy Event-adapter a rozhraní které implementují v balíčku java.awt.event Třída Event-adapter v java.awt.event
implementuje rozhraní
CommonentAdapter
ComponentListener
ContainerAdapter
ContainerListener
FocusAdapter
FocusListener
KeyAdapter
KeyListener
MouseAdapter
MouseListener
MouseMotionAdapter
MouseMotionListener
WindowAdapter
WindowListener
95
96 // Demonstrating mouse clicks and distinguishing between mouse buttons. buttons. import java. java.awt. awt.BorderLayout; BorderLayout; import java. java.awt. awt.Graphics; Graphics; import java. java.awt. awt.event. event.MouseAdapter; MouseAdapter; import java. java.awt. awt.event. event.MouseEvent; MouseEvent; import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; import javax.swing. javax.swing.JLabel .swing.JLabel; JLabel; public class MouseDetailsFrame extends JFrame { private String details; details; // String representing private JLabel statusBar; statusBar; // JLabel that appears at bottom of window // constructor sets title bar String and register mouse listener public MouseDetailsFrame() MouseDetailsFrame() { super( "Mouse clicks and buttons" buttons" ); statusBar = new JLabel( JLabel( "Click "Click the mouse" mouse" ); add( add( statusBar, statusBar, BorderLayout.SOUTH BorderLayout.SOUTH ); addMouseListener( addMouseListener( new MouseClickHandler() MouseClickHandler() ); // add handler } // end MouseDetailsFrame constructor
Osnova
97 // inner class to handle mouse events private class MouseClickHandler extends MouseAdapter { // handle mouse click event and determine which button was pressed public void mouseClicked( mouseClicked( MouseEvent event ) { int xPos = event. event.getX(); getX(); // get x position of mouse int yPos = event. event.getY(); getY(); // get y position of mouse details = String. String.format( format( "Clicked "Clicked %d time(s)", time(s)", event. event.getClickCount() getClickCount() ); if ( event. event.isMetaDown() isMetaDown() ) // right mouse button details += " with right mouse button"; button"; else if ( event. event.isAltDown() isAltDown() ) // middle mouse button details += " with center mouse button"; button"; else // left mouse button details += " with left mouse button"; button"; statusBar. statusBar.setText( setText( details ); // display message in statusBar } // end method mouseClicked } // end private inner class MouseClickHandler } // end class MouseDetailsFrame
Osnova
98 // Testing MouseDetailsFrame. MouseDetailsFrame. import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; public class MouseDetails { public static void main( main( String args[] args[] ) { MouseDetailsFrame mouseDetailsFrame = new MouseDetailsFrame(); MouseDetailsFrame(); mouseDetailsFrame. mouseDetailsFrame.setDefaultCloseOperation( setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE JFrame.EXIT_ON_CLOSE ); mouseDetailsFrame. mouseDetailsFrame.setSize( setSize( 400, 150 ); // set frame size mouseDetailsFrame. mouseDetailsFrame.setVisible( setVisible( true ); // display frame } // end main } // end class MouseDetails
Osnova Aplikace
99
Výsledky aplikace
Zpracování událostí klávesnice Key Event Handling • Rozhraní KeyListener – Zpracovává key events • události jsou generovány (vytvářeny) když je stisknuta klávesa a když je uvolněna klávesa • KeyEvent – Obsahuje virtual key code který reprezentuje klávesu
100
101 // Demonstrating keystroke events. events. import java. java.awt. awt.Color; Color; import java. java.awt. awt.event. event.KeyListener; KeyListener; import java. java.awt. awt.event. event.KeyEvent; KeyEvent; import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; import javax.swing. javax.swing.JTextArea .swing.JTextArea; JTextArea; public class KeyDemoFrame extends JFrame implements KeyListener { private String line1 = ""; // first line of textarea private String line2 = ""; // second line of textarea private String line3 = ""; // third line of textarea private JTextArea textArea; textArea; // textarea to display output // KeyDemoFrame constructor public KeyDemoFrame() KeyDemoFrame() { super( "Demonstrating "Demonstrating Keystroke Events" Events" ); textArea = new JTextArea( JTextArea( 10, 15 ); // set up JTextArea textArea. textArea.setText( setText( "Press "Press any key on the keyboard..." keyboard..." ); textArea. textArea.setEnabled( setEnabled( false ); // disable textarea textArea. textArea.setDisabledTextColor( setDisabledTextColor( Color.BLACK Color.BLACK ); // set text color add( add( textArea ); // add textarea to JFrame addKeyListener( addKeyListener( this ); // allow frame to process key events } // end KeyDemoFrame constructor
Osnova
102 // handle press of any key public void keyPressed( keyPressed( KeyEvent event ) { line1 = String.format( String.format( "Key pressed: %s", event.getKeyText( event.getKeyText( event.getKeyCode() event.getKeyCode() ) ); // output pressed key setLines2and3( event ); // set output lines two and three } // end method keyPressed // handle release of any key public void keyReleased( keyReleased( KeyEvent event ) { line1 = String.format( String.format( "Key released: %s", event.getKeyText( event.getKeyText( event.getKeyCode() event.getKeyCode() ) ); // output released key setLines2and3( event ); // set output lines two and three } // end method keyReleased // handle press of an action key public void keyTyped( keyTyped( KeyEvent event ) { line1 = String.format( String.format( "Key typed: %s", event.getKeyChar() event.getKeyChar() ); setLines2and3( event ); // set output lines two and three } // end method keyTyped // set second and third lines of output private void setLines2and3( KeyEvent event ) { line2 = String.format( String.format( "This key is %san action key", ( event.isActionKey() event.isActionKey() ? "" : "not " ) ); String temp = event.getKeyModifiersText( event.getKeyModifiersText( event.getModifiers() event.getModifiers() );
Osnova
103 line3 = String String. .format( format( "Modifier "Modifier keys pressed: pressed: %s", ( temp.equals temp.equals( equals( "" ) ? "none "none" none" : temp ) ); // output modifiers textArea. textArea.setText( setText( String. String.format( format( "%s\ "%s\n%s\ n%s\n%s\ n%s\n", line1, line2, line3 ) ); // output three lines of text } // end method setLines2and3 } // end class KeyDemoFrame
Osnova
104 // Testing KeyDemoFrame. KeyDemoFrame. import javax.swing. javax.swing.JFrame .swing.JFrame; JFrame; public class KeyDemo { public static void main( main( String args[] args[] ) { KeyDemoFrame keyDemoFrame = new KeyDemoFrame(); KeyDemoFrame(); keyDemoFrame. keyDemoFrame.setDefaultCloseOperation( setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE JFrame.EXIT_ON_CLOSE ); keyDemoFrame. keyDemoFrame.setSize( setSize( 350, 100 ); // set frame size keyDemoFrame. keyDemoFrame.setVisible( setVisible( true ); // display frame } // end main } // end class KeyDemo
Osnova
105
Výsledky aplikace