Grafické uživatelské rozhraní GUI event-driven programming událostmi řízené programování



Podobné dokumenty
Java GUI události. Událostmi řízené programování. Zpracování = obsluha událostí

Aplikace s grafickým uživatelským rozhraním

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

8. Grafické uživatelské rozhraní

GUI - úvod. V této kapitole si ukážeme návod, jak vytvořit jednoduchou grafickou aplikaci a umístit do ní některé další grafické prvky.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

GUI v Javě a událostmi řízené programování

Obsah přednášky. GUI v Javě a událostmi řízené programování. Základní prvky grafického rozhraní. Základní komponenty.

Grafické uživatelské rozhraní v Javě. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

GUI v Javě a událostmi řízené programování

Obsah přednášky. GUI v Javě a událostmi řízené programování. Základní prvky grafického rozhraní. Základní komponenty.

GUI v Javě a událostmi řízené programování

GUI v Javě (připomínka) Návrhář GUI Příklad aplikace MVC Model-View-Controller Události Vnitřní třídy. MVC Model-View-Controller

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

GUI v Javě. Jiří Vokřínek. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 5 B0B36PJV Programování v JAVA

GUI v Javě. GUI v Javě GUI komponenty a kontejnery Dialogová okna Události a obsluha událostí z GUI

Události. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

TÉMATICKÝ OKRUH Softwarové inženýrství

Grafické uživatelské rozhraní v Javě. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Seznámení s AWT: práce s okny, grafikou a textem

GUI v Javě. Jiří Vokřínek. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 5 B0B36PJV Programování v JAVA

2 Tvorba interaktivních grafických programů

Java - Kresba. 2/28/11 1/8 Java - kresba

Generické programování

Algoritmizace a programování

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Čipové karty Lekařská informatika

Projekty pro výuku programování v jazyce Java

Tvorba grafického uživatelského rozhraní v BlueJ

Úvod do programovacích jazyků (Java)

Diplomová práce Plugin do Eclipse pro tvorbu GUI s konfigurovatelným generováním zdrojového kódu

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Třída DrawingTool. Obrázek 1: Prázdné okno připravené pro kreslení

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

typová konverze typová inference

01. HODINA. 1.1 Spuštění programu VB Prvky integrovaného vývojového prostředí. - pomocí ikony, z menu Start.

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

JAVA JavaBeans Java, letní semestr

Swing. Přehled komponent. Java UI, letní semestr 2017/2018 1

JAVA GUI Java, zimní semestr

Jazyk C# (seminář 6)

Část I Příklad - Generické typy, iterátor

Java - výjimky. private void vstup() throws IOException {... }

GUI v Javě. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 3 A0B36PR2 Programování 2

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Kurz Databáze. Obsah. Formuláře. Práce s daty. Doc. Ing. Radim Farana, CSc.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Část I Příklad - Generické typy, iterátor

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jazyk C# (seminář 3)

Práce se soubory v Javě

Úvod do programování - Java. Cvičení č.4

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

IRAE 07/08 Přednáška č. 7. Začátek (head)

GUI v Javě. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 3 A0B36PR2 Programování 2

Technologie JavaBeans

Příloha 6. Palety nástrojů

PREPROCESOR POKRAČOVÁNÍ

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Java, grafické uživatelské rozhraní 2. Layout managery. Okno a kontejner

Klíčová slova: OOP, konstruktor, destruktor, třída, objekt, atribut, metoda

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Úloha 1. Text úlohy. Vyberte jednu z nabízených možností: NEPRAVDA. PRAVDA Úloha 2. Text úlohy

Výčtový typ strana 67

GUI v Jav a událostmi ízené programování

První kapitola úvod do problematiky

Chain of responsibility

Abstraktní datové typy: zásobník

Obrázek 6.14: Prohlížec nápovedy

Reliance 3 design OBSAH

VIII. Seminář Java VIII p.1/36

Teoretické minimum z PJV

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Java aplety. Předávání parametrů z HTML

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Formuláře. Aby nám mohli uživatelé něco hezného napsat třeba co si o nás myslí!

Postřehová hra. Zadání projektu. 1 Moje cíle

GUI. Systémová integrace pro desktopové aplikace

Programování v Javě I. Leden 2008

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Java a XML. 10/26/09 1/7 Java a XML

Základy objektové orientace I. Únor 2010

Seminář Java IV p.1/38

Projekt Obrázek strana 135

PŘETĚŽOVÁNÍ OPERÁTORŮ

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Uživatelská příručka Autor: Martin Fiala

První kroky s METEL IEC IDE

SWT & MigLayout. Alternativy Java GUI v praxi. Pavel Janečka & Tomáš Chlouba. červen 2011

XHTML 1. Formuláře. Element form. <form>... </form>

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Základy CSS (3. přednáška)

1. Programování proti rozhraní

APLIKACE V JAZYCE JAVA OVLÁDANÉ PŘES WWW

Programování v Javě I. Únor 2009

1. Nastavení dokumentu

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Algoritmizace a programování

Transkript:

Grafické uživatelské rozhraní GUI event-driven programming událostmi řízené programování 1

Osnova 2 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

1. Vytváření oken - základní balíčky 3 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

java.lang 4 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

import javax.swing..swing.jframe JFrame; public class TestOkna // object Window static JFrame okno = new JFrame("Toto je nazev okna"); Osnova Jednoduchý příklad na vytvoření okna 5 } public static void main(string String[] args) int sirkaokna = 400; // sirka okna v pixelech int vyskaokna = 150; // vyska okna v pixelech okno.setbounds setbounds(50, 100, // nastaveni pozice sirkaokna, vyskaokna); // a velikosti okno.setdefaultcloseoperation setdefaultcloseoperation(jframe JFrame.EXIT_ON_CLOSE); okno.setvisible setvisible(true true); // zobrazi okno }

Metoda setdefaultcloseoperation() 6 Argument EXIT_ON_CLOSE Popis co nastane při uzavření okna 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 HIDE_ON_CLOSE Operace uzavření je neúčinná. Okno se pouze skryje voláním metody setvisible(false). Možno později okno opět zobrazit s metodou setvisible(true).

2. Třída Component (Komponenta) 7 Komponenta je libovolný objekt třídy, která je potomkem třídy Component. Představuje grafický útvar, který může být zobrazen na obrazovce.

Třída Component a její podtřídy 8 Component Container Panel Window JComponent Applet Frame Dialog JApplet JFrame JDialog

Podtřídy třídy Component 9 Třída JFrame JDialog JApplet JComponent Popis 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í. Použití pro dialog s uživatelem. Základní třída pro applety programy běžící vnořené do webové stránky. Podtřídy této třídy definujířadu standardních komponent jako nabídky (menu), tlačítka, zaškrtávací políčka atd.

Okenní plochy 10 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()

3. Komponenty - atributy komponent 11 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

Atributy komponent 12 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)

Atributy komponent - pokračování 13 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)

Velikost a umístění komponenty 14 Metoda void setbounds(int x, int y, int sirka, int vyska) void setbounds(rectangle obdelnik) Rectangle getbounds() void setsize(dimension d) Dimension getsize() Popis Nastaví polohu (x, y) a velikost šířka, výška objektu typu Component Nastaví polohu a velikost objektu typu Component na hodnoty Rectangle(x, y, s, v) x, y - poloha, s, v - velikost Vrací polohu a velikost objektu typu Component Dimension(width, height) šířka a výška nastaví velikost na udané hodnoty Vrací aktuální velikost typu Component

Velikost a umístění komponenty 15 Metoda void setlocation(int x, int y) void setlocation(point p) Point getlocation() Popis Nastaví polohu komponenty na souřadnice definované v argumentech metody Nastaví polohu komponenty na souřadnice bodu p Vrací polohu objektu typu Component jako objekt typu bod point.

import javax.swing..swing.jframe JFrame; import java.awt awt.toolkit Toolkit; import java.awt awt.dimension Dimension; public class TestOkno1 // object awindow static JFrame awindow = new JFrame("T ("Toto je moje okno"); Osnova 16 Objektem třídy Toolkit můžeme měnit velikost a polohu okna na obrazovce } public static void main(string String[] args) Toolkit thekit = awindow.gettoolkit gettoolkit(); // ziska sadu nastroju // ziska velikost obrazovky Dimension wndsize = thekit.getscreensize getscreensize(); // Set the position to screen center & size to half screen size awindow.setbounds setbounds(wndsize wndsize.width width/4, wndsize.height height/4, // Pozice wndsize.width width/2, wndsize.height height/2); // Velikost awindow.setdefaultcloseoperation setdefaultcloseoperation(jframe JFrame.EXIT_ON_CLOSE); // Zobrazi okno awindow.setvisible setvisible(true true); }

Vizuální vlastnosti komponenty 17 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()

Metody pro vizualizaci komponenty 18 Metoda void setbackground (Color barva) Color getbackground() Popis Nastaví barvu pozadí nabarva. Vrátí aktuální barvu pozadí. void setforeground(color barva) Color getforeground() Nastaví barvu popředí na barva. Barva popředí popisy, texty. Vrátí aktuální barvu popředí. void setcursor(cursor kurzor) void setfont(font font) Nastaví komponentu kurzor na daný tvar. Nastaví font písma na font. Font getfont() Vrací aktuální font písma.

Základní barvy 19 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();

import javax.swing..swing.jframe JFrame; import java.awt awt.toolkit Toolkit; import java.awt awt.dimension Dimension; import java.awt awt.color Color; import java.awt awt.cursor Cursor; Osnova 20 public class TestOkno2 // object okno static JFrame okno = new JFrame("Toto je moje okno"); public static void main(string String[] args) Toolkit thekit = okno.gettoolkit gettoolkit(); // Get the window toolkit Dimension wndsize = thekit.getscreensize getscreensize(); // Get screen size } } // Set the position to screen center & size to half screen size okno.setbounds setbounds(wndsize wndsize.width width/4, wndsize.height height/4, // Position wndsize.width width/2, wndsize.height height/2); // Size okno.setdefaultcloseoperation setdefaultcloseoperation(jframe JFrame.EXIT_ON_CLOSE); okno.setcursor setcursor(cursor Cursor.getPredefinedCursor getpredefinedcursor(cursor Cursor.CROSSHAIR_CURSOR)); okno.getcontentpane getcontentpane(). ().setbackground setbackground(color Color.PINK); okno.setvisible setvisible(true true); // Display the window

4. Swingové komponenty 21 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)

Tlačítka 22 JButton klasické tlačítko JCheckBox zaškrtávací tlačítka JRadioButton radiová tlačítka použito pouze jedno

Nabídky - menu 23 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

Textové komponenty 24 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

Ostatní swingové komponenty 25 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ší.

5. Třída Container, její podtřídy použití 26 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 27 Metoda int getcomponentcount() Component getcomponent(int index) Component[] getcomponents() Popis Vrací počet komponent obsažených v aktuální komponentě. Vrací komponentu určenou indexem od 0 do n-1, jinak výjimka ArrayIndexOutOfBoundsException Vrací pole všech komponent v aktuálním kontejneru

Přidávání komponent do kontejneru 28 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.

Přidávání komponent do kontejneru 29 Metoda Component add ( Component c) Component add ( Component c, int index) void add(component c, Object omezeni) void add(component c, Object omezeni, int index) Popis Přidá komponentu c na konec seznamu komponent uložených v kontejneru. Vrácená je komponenta c. Přidá komponentu c na pozici indexu. Je-li index -1, přidá komponentu na konec seznamu. Vrácená hodnota je c. 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í. 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 30 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í.

Správce rozvržení 31 Správce rozmístění FlowLayout BorderLayout CardLayout GridLayout Popis 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) Umisťuje komponenty do 5 oblastí: sever, jih, východ, západ a střed. Implicitní pro: JFrame, JDialog a JApplet Umisťuje komponenty v kontejneru jednu na druhou, jako v balíčku karet. Viditelná je pouze ta nahoře. Rozmisťuje komponenty v kontejneru do obdelníkové mřížky s vámi zadaným počtem řádků a sloupců.

Správce rozvržení 32 Správce rozmístění GridBagLayout BoxLayout SpringLayout Popis 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. 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. Umožňuje zadání polohy komponenty pomocí pružin (springs) připevněných k hraně kontejneru nebo k další komponentě v kontejneru.

Správce rozvržení v kontejneru 33 TřidyBoxLayout, 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.

Správce rozvržení v kontejneru 34 změna správce rozvržení: FlowLayout tok = new FlowLayout(); okno.getcontentpane().setlayout(tok);

import javax.swing..swing.jframe JFrame; import javax.swing..swing.jbutton JButton; Osnova 35 import java.awt awt.toolkit Toolkit; import java.awt awt.dimension Dimension; import java.awt awt.container Container; import java.awt awt.flowlayout FlowLayout; public class TryFlowLayout // The window object static JFrame awindow = new JFrame(" ("This is the Window Title"); public static void main(string String[] args) Toolkit thekit = awindow.gettoolkit gettoolkit(); // Get the window toolkit Dimension wndsize = thekit.getscreensize getscreensize(); // Get screen size // Set the position to screen center & size to half screen size awindow.setbounds setbounds(wndsize wndsize.width width/4, wndsize.height height/4, // Position wndsize.width width/2, wndsize.height height/2); // Size awindow.setdefaultcloseoperation setdefaultcloseoperation(jframe JFrame.EXIT_ON_CLOSE); FlowLayout flow = new FlowLayout(); // Create a layout manager //FlowLayout flow = new FlowLayout(FlowLayout FlowLayout.LEFT); //FlowLayout flow = new FlowLayout(FlowLayout FlowLayout.LEFT, 20, 30);

Container content = awindow.getcontentpane getcontentpane(); // Get the content pane content.setlayout setlayout(flow flow); // Set the container layout mgr Osnova 36 // Pridani sesti tlacitkovych komponent for(int i = 1; i <= 6; i++) content.add add(new JButton(" ("Press " + i)); // Add a Button to content // pane } } awindow.pack pack(); awindow.setvisible setvisible(true true); // Display the window

7. Zpracování událostí (events) 37 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í

Zpracování událostí (events) 38 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)

Událostmi řízené programy 39 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.

Událostmi řízené programy 40 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.

Událostmi řízené programy 41 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:

while ( theapp.isrunning isrunning() ) Event e = nextevent(); // získ z ská novou událost z fronty událost lostí int id = e.getid getid(); switch( id ) case Event_MouseClick MouseClick; theapp.handlemouseclick handlemouseclick(); break; case Event_Mouse Mouse_Move Move; theapp.handlemousemove handlemousemove(); break; case Event_ButtonPush ButtonPush; theapp.handlebuttonpush handlebuttonpush(); break; case Event_KeyPush KeyPush; theapp.handlekeypush handlekeypush(); break; //... další události default: ignoreevent(e); break; } } Osnova 42 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).

Model delegování událostí 43 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í).

Model delegování událostí 44 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.

Model delegování událostí 45 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.

Model delegování událostí 46 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.

Model delegování událostí 47 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.

Model delegování událostí 48 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.

Událost, posluchač, metoda zpětného volání 49 Třída události (Event class) Rozhraní posluchače (Listener interface) Metoda callback (Listener callback) ActionEvent ActionListener actionperformed() AdjustmentEvent AdjustmentListener adjustmentvaluechanged() ComponentEvent ComponentListener componenthidden() componentmoved() componentresized() componetshown() ContainerEvent ContainerListener componentadded() componentremoved() FocusEvent FocusListener focusgained() focuslost() ItemEvent ItemListener itemstatechanged() MouseEvent MouseListener mouseclicled() mouseentered() mousepressed() mousereleased() MouseMotionListener mousedrag() mousemoved() TextEvent TextListener textvaluechanged() WindowEvent WindowListener windowactivated() windowclosed() windowclosing() windowdeactivated() windowdeiconified() windowicinified() windowopened()

import java.awt awt.flowlayout FlowLayout; import java.awt awt.event event.actionlistener ActionListener; import java.awt awt.event event.actionevent ActionEvent; import javax.swing..swing.jframe JFrame; import javax.swing..swing.jbutton JButton; import javax.swing..swing.joptionpane JOptionPane; Osnova 50 public class ButtonFrame extends JFrame private JButton tlacitkostart; // tlacitko s textem private JButton tlacitkostop; // ButtonFrame prida JButtons do JFrame public ButtonFrame() super( "Testování tlačítek" tek" ); setlayout( new FlowLayout() ); // nastaveni spravce rozvrzeni tlacitkostart = new JButton( "Start" ); add( tlacitkostart ); // prida tlacitkostart do kontejneru JFrame tlacitkostop = new JButton( "Stop"); add( tlacitkostop ); // vytvoreni noveho ovladace ButtonHandler pro zpracovani udalosti // tlacitek ButtonHandler handler = new ButtonHandler(); ();//d //dále deklarovaná třída tlacitkostop.addactionlistener addactionlistener( handler ); tlacitkostart.addactionlistener addactionlistener( handler ); } // konec ButtonFrame konstruktoru

// vnitrni trida pro zpracovani udalosti tlacitek // ButtonHandler naslouchací objekt tlačítka tka private class ButtonHandler implements ActionListener // zpracuje udalost tlacitka public void actionperformed( ActionEvent udalost ) JOptionPane.showMessageDialog showmessagedialog( ButtonFrame.this this, String.format format( "Stiskli jste: %s", udalost.getactioncommand getactioncommand() ) ); } // konec metody actionperformed } // konec soukrome vnitrni tridy ButtonHandler } // konec tridy ButtonFrame Osnova 51

import javax.swing..swing.jframe JFrame; Osnova 52 public class ButtonTest public static void main( String args[] ) ButtonFrame buttonframe = new ButtonFrame(); // vytvoreni instance buttonframe.setdefaultcloseoperation setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); buttonframe.setsize setsize( 275, 110 ); // nastaveni velikost okna buttonframe.setvisible setvisible( true ); // zobrazeni okna } }

Třídy událostí 53 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 54 Událost FocusEvent Popis 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.

9. Třída AWTEvent 55 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

Třída AWTEvent 56 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

Třída AWTEvent 57 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.

Sémantické události 58 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

Sémantické události 59 Typ události ActionEvent ItemEvent AdjustmentEvent Generované objekty typu Tlačítka: JButton, JToggleButton, JCheckBox Nabídky: JMenuItem, JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem Text: JTextField Tlačítka: JButton, JToggleButton, JCheckBox Nabídky: JMenuItem, JMenu, JCheckBoxMenuItem, JRadioButtonMenuItem 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í ActionListener ItemListener AdjustmentListener Metoda void actionperformed(actionevent e) void itemstatechanged(itemevent c) void adjustmentvaluechanged(adjustmentevent e)

Třída událostí ActionEvent rozhraní ActionListener 61 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()

Jednoduchý čítač 62 část model část view a controller aplikace

public class Counter Osnova 63 } private int cnt = 0; public void incr() cnt++; } public void decr() cnt cnt-- --; } public void clr() cnt = 0; } public int getcnt() return cnt; }

import java.awt awt.flowlayout FlowLayout; import java.awt awt.event event.actionlistener ActionListener; import java.awt awt.event event.actionevent ActionEvent; import javax.swing..swing.jframe JFrame; import javax.swing..swing.jtextfield JTextField; import javax.swing..swing.jlabel JLabel; import javax.swing..swing.jbutton JButton; Osnova 64 public class CounterFrame extends JFrame private Counter c = new Counter(); private JButton increment, decrement, clear; private JTextField field; private JLabel label; public CounterFrame() super("jenoduchý číta tač"); setlayout(new FlowLayout()); label = new JLabel("Stav číta tače: "); add(label label); field = new JTextField(6); field.seteditable seteditable(false false); field.sethorizontalalignment sethorizontalalignment(jtextfield JTextField.RIGHT); add(field field); field.settext settext(string String.valueOf valueof(c. (c.getcnt getcnt())); increment = new JButton(" ("Increment Increment"); add(increment increment); decrement = new JButton(" ("Decrement Decrement"); add(decrement decrement); clear = new JButton(" ("Clear Clear"); add(clear clear);

ButtonHandler handler = new ButtonHandler(); increment.addactionlistener addactionlistener(handler handler); decrement.addactionlistener addactionlistener(handler handler); clear.addactionlistener addactionlistener(handler handler); } private class ButtonHandler implements ActionListener public void actionperformed(actionevent event) if(event event.getsource getsource()== ()==increment increment) c.incr incr(); field.settext settext(string String.valueOf valueof(c. (c.getcnt getcnt())); } else if(event event.getsource getsource()== ()==decrement decrement) c.decr decr(); field.settext settext(string String.valueOf valueof(c. (c.getcnt getcnt())); } else if(event event.getsource getsource()== ()==clear clear) c.clr clr(); field.settext settext(string String.valueOf valueof(c. (c.getcnt getcnt())); } } } Osnova 65 }

import javax.swing..swing.jframe JFrame; public class CounterFrameTest Osnova 66 } public static void main(string args[]) CounterFrame counterframe= new CounterFrame(); counterframe.setdefaultcloseoperation (JFrame JFrame.EXIT_ON_CLOSE); counterframe.setsize setsize(400, 200); counterframe.setvisible setvisible(true true); }

10. Přehled Swingových komponent 67 Komponenta JLabel JTextField JButton JCheckBox JComboBox JList JPanel Popis Zobrazuje needitovatelný text, nebo ikony Umožňuje uživateli vstup dat z klávesnice. Je možné také použít pro zobrazení editovatelných a needitovatelných textů. Spouští událost kliknutím myši na tlačítko. Specifikuje volby Poskytuje drop-down seznam položek pro výběr nebo doplnění. Poskytuje seznam položek pro jedno i vícenásobný výběr. 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 68 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 *)

// Demonstrating the JTextField class. import java.awt awt.flowlayout FlowLayout; import java.awt awt.event event.actionlistener ActionListener; import java.awt awt.event event.actionevent ActionEvent; import javax.swing..swing.jframe JFrame; import javax.swing..swing.jtextfield JTextField; import javax.swing..swing.jpasswordfield JPasswordField; import javax.swing..swing.joptionpane JOptionPane; Osnova 69 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; // password field with text // TextFieldFrame constructor adds JTextFields to JFrame public TextFieldFrame() super( "Testing " JTextField and JPasswordField" ); setlayout( new FlowLayout() ); // set frame layout // construct textfield with 10 columns textfield1 = new JTextField( 10 ); add( textfield1 ); // add textfield1 to JFrame // construct textfield with default text textfield2 = new JTextField( "Enter" text here" ); add( textfield2 ); // add textfield2 to JFrame

// construct textfield with default text and 21 columns textfield3 = new JTextField( "Uneditable" text field", 21 ); textfield3.seteditable seteditable( false ); // disable editing add( textfield3 ); // add textfield3 to JFrame Osnova 70 // construct passwordfield with default text passwordfield = new JPasswordField( "Hidden" text" ); add( passwordfield ); // add passwordfield to JFrame // register event handlers TextFieldHandler handler = new TextFieldHandler(); textfield1.addactionlistener addactionlistener( handler ); textfield2.addactionlistener addactionlistener( handler ); textfield3.addactionlistener addactionlistener( handler ); 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.getsource getsource() == textfield1 ) string = String.format format( "textfield1: %s", event.getactioncommand getactioncommand() );

// user pressed Enter in JTextField textfield2 else if ( event.getsource getsource() == textfield2 ) string = String.format format( "textfield2: %s", event.getactioncommand getactioncommand() ); Osnova 71 // user pressed Enter in JTextField textfield3 else if ( event.getsource getsource() == textfield3 ) string = String.format format( "textfield3: %s", event.getactioncommand getactioncommand() ); // user pressed Enter in JTextField passwordfield else if ( event.getsource getsource() == passwordfield ) string = String.format format( "passwordfield" passwordfield: %s", new String( passwordfield.getpassword getpassword() ) ); // display JTextField content JOptionPane.showMessageDialog showmessagedialog( null, string ); } // end method actionperformed } // end private inner class TextFieldHandler } // end class TextFieldFrame

// Testing TextFieldFrame. import javax.swing..swing.jframe JFrame; Osnova 72 public class TextFieldTest public static void main( String args[] ) TextFieldFrame textfieldframe = new TextFieldFrame(); textfieldframe.setdefaultcloseoperation setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); textfieldframe.setsize setsize( 325, 100 ); // set frame size textfieldframe.setvisible setvisible( true ); // display frame } // end main } // end class TextFieldTest

Výstupy aplikace 73

Výstupy aplikace 74

75 Některé běžné rozhraní event-listener balíčku java.awt.event interface EventListener interface ActionListener interface AdjustmentListener interface ComponentListener interface ContainerListener interface FocusListener interface ItemListener interface KeyListener interface MouseListener interface MouseMotionListener interface TextListener interface WindowListener «interface» EventListener «interface» ActionListener «interface» AdjustmentListener «interface» ComponentListener «interface» ContainerListener «interface» FocusListener «interface» ItemListener «interface» KeyListener «interface» MouseListener «interface» MouseMotionListener «interface» TextListener «interface» TextListener

JList 76 Seznam (List) Řada položek uživatel může vybrat jednu nebo více pložek Single-selection vs. multiple-selection JList

// Selecting colors from a JList. import java.awt awt.flowlayout FlowLayout; import java.awt awt.color Color; import javax.swing..swing.jframe JFrame; import javax.swing..swing.jlist JList; import javax.swing..swing.jscrollpane JScrollPane; import javax.swing..swing.event event.listselectionlistener ListSelectionListener; import javax.swing..swing.event event.listselectionevent ListSelectionEvent; import javax.swing..swing.listselectionmodel ListSelectionModel; Osnova 77 public class ListFrame extends JFrame private JList colorjlist; // list to display colors private final String colornames[] = "Black" Black", "Blue" Blue", "Cyan" Cyan", "Dark Gray", "Gray" Gray", "Green" Green", "Light" Gray", "Magenta" Magenta", "Orange Orange", "Pink", "Red" Red", "White" White", "Yellow" Yellow" }; private final Color colors[] = Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED, Color.WHITE, Color.YELLOW }; // ListFrame constructor add JScrollPane containing JList to JFrame public ListFrame() super( "List Test" ); setlayout( new FlowLayout() ); // set frame layout colorjlist = new JList( colornames ); // create with colornames colorjlist.setvisiblerowcount setvisiblerowcount( 5 ); // display five rows at once

// do not allow multiple selections colorjlist.setselectionmode setselectionmode( ListSelectionModel.SINGLE_SELECTION ); Osnova 78 // add a JScrollPane containing JList to frame add( new JScrollPane( colorjlist ) ); colorjlist.addlistselectionlistener addlistselectionlistener( new ListSelectionListener() // anonymous inner class // handle list selection events public void valuechanged( ListSelectionEvent event ) getcontentpane(). ().setbackground setbackground( colors[ colorjlist.getselectedindex getselectedindex() ] ); } // end method valuechanged } // end anonymous inner class ); // end call to addlistselectionlistener } // end ListFrame constructor } // end class ListFrame

// Selecting colors from a JList. import javax.swing..swing.jframe JFrame; public class ListTest public static void main( String args[] ) ListFrame listframe = new ListFrame(); // create ListFrame listframe.setdefaultcloseoperation setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); listframe.setsize setsize( 350, 150 ); // set frame size listframe.setvisible setvisible( true ); // display frame } // end main } // end class ListTest Aplikace Osnova 79

Výstupy aplikace 80

Multiple-Selection Lists 81 Multiple-selection list Select many items from Jlist Allows continuous range selection

// Copying items from one List to another. import java.awt awt.flowlayout FlowLayout; import java.awt awt.event event.actionlistener ActionListener; import java.awt awt.event event.actionevent ActionEvent; import javax.swing..swing.jframe JFrame; import javax.swing..swing.jlist JList; import javax.swing..swing.jbutton JButton; import javax.swing..swing.jscrollpane JScrollPane; import javax.swing..swing.listselectionmodel ListSelectionModel; Osnova 82 public class MultipleSelectionFrame extends JFrame private JList colorjlist; // list to hold color names private JList copyjlist; // list to copy color names into private JButton copyjbutton; // button to copy selected names private final String colornames[] = "Black" Black", "Blue" Blue", "Cyan" Cyan", "Dark Gray", "Gray" Gray", "Green" Green", "Light" Gray", "Magenta" Magenta", "Orange" Orange", "Pink", "Red " Red", "White" White", "Yellow" Yellow" }; // MultipleSelectionFrame constructor public MultipleSelectionFrame() super( "Multiple " Selection Lists" ); setlayout( new FlowLayout() ); // set frame layout colorjlist = new JList( colornames ); // holds names of all colors colorjlist.setvisiblerowcount setvisiblerowcount( 5 ); // show five rows colorjlist.setselectionmode setselectionmode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ); add( new JScrollPane( colorjlist ) ); // add list with scrollpane

copyjbutton = new JButton( "Copy >>>" ); // create copy button copyjbutton.addactionlistener addactionlistener( Osnova 83 new ActionListener() // anonymous inner class // handle button event public void actionperformed( ActionEvent event ) // place selected values in copyjlist copyjlist.setlistdata setlistdata( colorjlist.getselectedvalues getselectedvalues() ); } // end method actionperformed } // end anonymous inner class ); // end call to addactionlistener add( copyjbutton ); // add copy button to JFrame copyjlist = new JList(); // create list to hold copied color names copyjlist.setvisiblerowcount setvisiblerowcount( 5 ); // show 5 rows copyjlist.setfixedcellwidth setfixedcellwidth( 100 ); // set width copyjlist.setfixedcellheight setfixedcellheight( 15 ); // set height copyjlist.setselectionmode setselectionmode( ListSelectionModel.SINGLE_INTERVAL_SELECTION ); add( new JScrollPane( copyjlist ) ); // add list with scrollpane } // end MultipleSelectionFrame constructor } // end class MultipleSelectionFrame

// Testing MultipleSelectionFrame. import javax.swing..swing.jframe JFrame; Osnova 84 public class MultipleSelectionTest public static void main( String args[] ) MultipleSelectionFrame multipleselectionframe = new MultipleSelectionFrame(); multipleselectionframe.setdefaultcloseoperation setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); multipleselectionframe.setsize setsize( 350, 140 ); // set frame size multipleselectionframe.setvisible setvisible( true ); // display frame } // end main } // end class MultipleSelectionTest

Výstupy aplikace 85

Mouse Event Handling 86 Rozhraní Event-listener pro události způsobené myší MouseListener MouseMotionListener Listen for MouseEvents

Metody rozhraní MouseListener 87 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.

Metody rozhraní MouseMotionListener 88 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š.

// Demonstrating mouse events. import java.awt awt.color Color; import java.awt awt.borderlayout BorderLayout; import java.awt awt.event event.mouselistener MouseListener; import java.awt awt.event event.mousemotionlistener MouseMotionListener; import java.awt awt.event event.mouseevent MouseEvent; import javax.swing..swing.jframe JFrame; import javax.swing..swing.jlabel JLabel; import javax.swing..swing.jpanel JPanel; Osnova 89 public class MouseTrackerFrame extends JFrame private JPanel mousepanel; // panel in which mouse events will occur private JLabel statusbar; // label that displays event information // MouseTrackerFrame constructor sets up GUI and // registers mouse event handlers public MouseTrackerFrame() super( "Demonstrating " Mouse Events" ); mousepanel = new JPanel(); // create panel mousepanel.setbackground setbackground( Color.WHITE ); // set background color add( mousepanel, BorderLayout.CENTER ); // add panel to JFrame statusbar = new JLabel( "Mouse outside JPanel" ); add( statusbar, BorderLayout.SOUTH ); // add label to JFrame

// create and register listener for mouse and mouse motion events MouseHandler handler = new MouseHandler(); mousepanel.addmouselistener addmouselistener( handler ); mousepanel.addmousemotionlistener addmousemotionlistener( handler ); } // end MouseTrackerFrame constructor Osnova 90 private class MouseHandler implements MouseListener, MouseMotionListener // MouseListener event handlers // handle event when mouse released immediately after press public void mouseclicked( MouseEvent event ) statusbar.settext settext( String.format format( "Clicked" at [%d, %d]", event.getx getx(), event.gety gety() ) ); } // end method mouseclicked // handle event when mouse pressed public void mousepressed( MouseEvent event ) statusbar.settext settext( String.format format( "Pressed" at [%d, %d]", event.getx getx(), event.gety gety() ) ); } // end method mousepressed // handle event when mouse released after dragging public void mousereleased( MouseEvent event ) statusbar.settext settext( String.format format( "Released" at [%d, %d]", event.getx getx(), event.gety gety() ) ); } // end method mousereleased

// handle event when mouse enters area public void mouseentered( MouseEvent event ) statusbar.settext settext( String.format format( "Mouse entered at [%d, %d]", event.getx getx(), event.gety gety() ) ); mousepanel.setbackground setbackground( Color.GREEN ); } // end method mouseentered Osnova 91 // handle event when mouse exits area public void mouseexited( MouseEvent event ) statusbar.settext settext( "Mouse outside JPanel" ); mousepanel.setbackground setbackground( Color.WHITE ); } // end method mouseexited // MouseMotionListener event handlers // handle event when user drags mouse with button pressed public void mousedragged( MouseEvent event ) statusbar.settext settext( String.format format( "Dragged" at [%d, %d]", event.getx getx(), event.gety gety() ) ); } // end method mousedragged // handle event when user moves mouse public void mousemoved( MouseEvent event ) statusbar.settext settext( String.format format( "Moved" at [%d, %d]", event.getx getx(), event.gety gety() ) ); } // end method mousemoved } // end inner class MouseHandler } // end class MouseTrackerFrame

// Testing MouseTrackerFrame. import javax.swing..swing.jframe JFrame; Osnova 92 public class MouseTracker public static void main( String args[] ) MouseTrackerFrame mousetrackerframe = new MouseTrackerFrame(); mousetrackerframe.setdefaultcloseoperation setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); mousetrackerframe.setsize setsize( 300, 100 ); // set frame size mousetrackerframe.setvisible setvisible( true ); // display frame } // end main } // end class MouseTracker

Výstupy aplikace 93

Třídy Adapter 94 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 95 Třída Event-adapter v java.awt.event CommonentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter implementuje rozhraní ComponentListener ContainerListener FocusListener KeyListener MouseListener MouseMotionListener WindowListener

// Demonstrating mouse clicks and distinguishing between mouse buttons. import java.awt awt.borderlayout BorderLayout; import java.awt awt.graphics Graphics; import java.awt awt.event event.mouseadapter MouseAdapter; import java.awt awt.event event.mouseevent MouseEvent; import javax.swing..swing.jframe JFrame; import javax.swing..swing.jlabel JLabel; Osnova 96 public class MouseDetailsFrame extends JFrame private String details; // String representing private JLabel statusbar; // JLabel that appears at bottom of window // constructor sets title bar String and register mouse listener public MouseDetailsFrame() super( "Mouse clicks and buttons" ); statusbar = new JLabel( "Click" the mouse" ); add( statusbar, BorderLayout.SOUTH ); addmouselistener( new MouseClickHandler() ); // add handler } // end MouseDetailsFrame constructor

// inner class to handle mouse events private class MouseClickHandler extends MouseAdapter // handle mouse click event and determine which button was pressed public void mouseclicked( MouseEvent event ) int xpos = event.getx getx(); // get x position of mouse int ypos = event.gety gety(); // get y position of mouse Osnova 97 details = String.format format( "Clicked" %d time(s)", event.getclickcount getclickcount() ); if ( event.ismetadown ismetadown() ) // right mouse button details += " with right mouse button"; else if ( event.isaltdown isaltdown() ) // middle mouse button details += " with center mouse button"; else // left mouse button details += " with left mouse button"; statusbar.settext settext( details ); // display message in statusbar } // end method mouseclicked } // end private inner class MouseClickHandler } // end class MouseDetailsFrame

// Testing MouseDetailsFrame. import javax.swing..swing.jframe JFrame; public class MouseDetails public static void main( String args[] ) MouseDetailsFrame mousedetailsframe = new MouseDetailsFrame(); mousedetailsframe.setdefaultcloseoperation setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); mousedetailsframe.setsize setsize( 400, 150 ); // set frame size mousedetailsframe.setvisible setvisible( true ); // display frame } // end main } // end class MouseDetails Aplikace Osnova 98

Výsledky aplikace 99

Zpracování událostí klávesnice Key Event Handling 100 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

// Demonstrating keystroke events. import java.awt awt.color Color; import java.awt awt.event event.keylistener KeyListener; import java.awt awt.event event.keyevent KeyEvent; import javax.swing..swing.jframe JFrame; import javax.swing..swing.jtextarea JTextArea; Osnova 101 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 to display output // KeyDemoFrame constructor public KeyDemoFrame() super( "Demonstrating " Keystroke Events" ); textarea = new JTextArea( 10, 15 ); // set up JTextArea textarea.settext settext( "Press" any key on the keyboard..." ); textarea.setenabled setenabled( false ); // disable textarea textarea.setdisabledtextcolor setdisabledtextcolor( Color.BLACK ); // set text color add( textarea ); // add textarea to JFrame addkeylistener( this ); // allow frame to process key events } // end KeyDemoFrame constructor

// handle press of any key public void keypressed( KeyEvent event ) line1 = String.format( "Key pressed: %s", event.getkeytext( event.getkeycode() ) ); // output pressed key setlines2and3( event ); // set output lines two and three } // end method keypressed Osnova 102 // handle release of any key public void keyreleased( KeyEvent event ) line1 = String.format( "Key released: %s", event.getkeytext( 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( KeyEvent event ) line1 = String.format( "Key typed: %s", 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( "This key is %san action key", ( event.isactionkey()? "" : "not " ) ); String temp = event.getkeymodifierstext( event.getmodifiers() );

line3 = String.format format( "Modifier" keys pressed: %s", ( temp.equals equals( "" )? "none" none" : temp ) ); // output modifiers Osnova 103 textarea.settext settext( String.format format( "%s\n%s n%s\n%s n%s\n", n", line1, line2, line3 ) ); // output three lines of text } // end method setlines2and3 } // end class KeyDemoFrame

// Testing KeyDemoFrame. import javax.swing..swing.jframe JFrame; Osnova 104 public class KeyDemo public static void main( String args[] ) KeyDemoFrame keydemoframe = new KeyDemoFrame(); keydemoframe.setdefaultcloseoperation setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); keydemoframe.setsize setsize( 350, 100 ); // set frame size keydemoframe.setvisible setvisible( true ); // display frame } // end main } // end class KeyDemo

Výsledky aplikace 105