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

Podobné dokumenty
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í

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ě (připomínka) Návrhář GUI Příklad aplikace MVC Model-View-Controller Události Vnitřní třídy. MVC Model-View-Controller

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

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

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

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.

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

2 Tvorba interaktivních grafických programů

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

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

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

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

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

Hiearchical MVC (Model-view-controller) vs. PAC (Presentation-abstraction-control)

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

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

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

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

1. Programování proti rozhraní

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

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

KTE / ZPE Informační technologie

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

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

Generické programování

Datové struktury. alg12 1

Jazyk C# (seminář 6)

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

Algoritmizace a programování

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

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

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Úvod do programovacích jazyků (Java)

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

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

8. Grafické uživatelské rozhraní

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

Lambda funkce Novinky v interfaces Streamy Optional - aneb zbavujeme se null. Java 8. Ondřej Hrstka

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.

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

Algoritmizace a programování

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

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

Vícevláknové aplikace modely a příklady

GUI. Systémová integrace pro desktopové aplikace

Abstraktní datové typy: zásobník

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

RMI Remote Method Invocation

Výčtový typ strana 67

Abstraktní třída a rozhraní

Komponenty v.net. Obsah přednášky

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

Část 1 Využití vláken v GUI. Vícevláknové aplikace modely a příklady. Část 2 Modely vícevláknových aplikací

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

JAVA JavaBeans Java, letní semestr

Základy objektové orientace I. Únor 2010

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

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

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

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

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

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

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

Java Výjimky Java, zimní semestr

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Dědění, polymorfismus

Vytváření a použití knihoven tříd

1. Téma 12 - Textové soubory a výjimky

typová konverze typová inference

Programování v Javě I. Leden 2008

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

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

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Teoretické minimum z PJV

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Technologie JavaBeans

Jazyk C# (seminář 3)

Vláknové programování část V

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

8 Třídy, objekty, metody, předávání argumentů metod

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

Tvorba informačních systémů

Dědičnost (inheritance)

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Vstupní požadavky, doporučení a metodické pokyny

Iterator & for cyklus

Příloha 6. Palety nástrojů

9. přednáška - třídy, objekty

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Programování v C++ 2, 4. cvičení

Část 1 Paralelní programování. Vícevláknové aplikace. Část 2 Vícevláknové aplikace. Část 3 Využití vláken v GUI

JavaScript 101. "Trocha života do statických stránek"

Transkript:

GUI v Javě a událostmi řízené programování Jiří Vokřínek Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Přednáška 6 B0B36PJV Programování v JAVA Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 1 / 42

Obsah přednášky GUI v Javě (připomínka) Návrhář GUI Příklad aplikace MVC Model-View-Controller Události Vnitřní třídy Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 2 / 42

Základní prvky grafického rozhraní Komponenty tlačítka, textová pole, menu, posuvníky,... Kontejnery komponenty, do kterých lze vkládat komponenty Například pro rozdělení plochy a volbu rozmístění Správce rozvržení (Layout manager) rozmísťuje komponenty v ploše kontejneru Interakce s uživatelem dále zpravidla vyžaduje mechanismus událostí a jejich zachytávání Swing Toolkit http://docs.oracle.com/javase/tutorial/uiswing Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 3 / 42

Základní komponenty Komponenty a dialogové prvky Tlačítka, text, textová pole, seznamy, přepínače javax.swing Kontejnery (v oknech, která zpravidla řeší prostředí OS) javax.swing Komponenty obsahují komponenty Komponenty musí být umístěny v kontejneru Kontejnery se vkládají do oken JFrame obecný kontejner okno JPanel kontejner po jednoduché komponenty Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 4 / 42

Návrhář formulářů Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 5 / 42

Příklad návrhu aplikace BarComp Naším cílem je vytvořit jednoduchou aplikaci s dvěma sadami tlačítek pro ovládání výpočtu s vizualizací postupu výpočtu a stavu aplikace. Aplikace má 4 základní komponenty 1. Hlavní ovládací tlačítka 2. Tlačítka pro nastavení 3. Progress bar 4. Stavový řádek Control buttons Buttons for parameters (fun) Computation visualization Status information Aplikaci použijeme pro demonstraci zpracování událostí a ukázku dílčích konceptů. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 6 / 42

Struktura aplikace BarComp Aplikace se skládá z výpočetního modelu Model, grafických komponent MyBarPanel a spouštěcí třídy DemoBarComp public class DemoBarComp { void start() {... public static void main(string[] args) { DemoBarComp demo = new DemoBarComp(); demo.start(); lec06/demobarcomp Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 7 / 42

Struktura aplikace DemoBarComp start void start() { JFrame frame = new JFrame("PJV - lec06 - Demo Progress Bar of the Computation"); frame.setdefaultcloseoperation(jframe. EXIT_ON_CLOSE); frame.setminimumsize(new Dimension(480, 240)); MyBarPanel mybarpanel = new MyBarPanel(); frame.getcontentpane().add(mybarpanel); frame.pack(); frame.setvisible(true); mybarpanel.setcomputation(new Model()); lec06/demobarcomp Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 8 / 42

MyBarPanel základní struktura public class MyBarPanel extends JPanel { JTextField status; JProgressBar bar; Model computation; public MyBarPanel() { computation = null; createcomponents(); public void setcomputation(model computation) { this.computation = computation; private void createcomponents() {... lec06/mybarpanel Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 9 / 42

MyBarPanel createcomponents private void createcomponents() { // 1st row of the control buttons JPanel controlbuttonspanel = new JPanel(); createcontrolbuttons(controlbuttonspanel); // 2nd row of the buttons JPanel buttonspanel = new JPanel(); createbuttons(buttonspanel); // 3rd row with the progress bar bar = new JProgressBar(0, 100); // 0-100% JPanel progresspanel = new JPanel(); createprogress(progresspanel, bar); // 4th row with the status bar status = createstatusbar("waiting for your commands"); // Set layout and add the rows setlayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(controlbuttonspanel); add(buttonspanel); add(progresspanel); add(status); lec06/mybarpanel Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 10 / 42

MyBarPanel createcontrolbuttons private JPanel createcontrolbuttons(jpanel panel) { JButton btncompute = new JButton("Compute"); JButton btnstop = new JButton("Stop"); JButton btnquit = new JButton("Quit"); panel.add(btncompute); panel.add(btnstop); panel.add(btnquit); return panel; lec06/mybarpanel Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 11 / 42

MyBarPanel createbuttons private JPanel createcontrolbuttons(jpanel panel) { JButton btncompute = new JButton("Compute"); JButton btnstop = new JButton("Stop"); JButton btnquit = new JButton("Quit"); btnquit.addactionlistener(new ActionListener() { @Override public void actionperformed(actionevent e) { System.out.println("Force quit"); System.exit(0); ); panel.add(btncompute); panel.add(btnstop); panel.add(btnquit); return panel; lec06/mybarpanel Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 12 / 42

MyBarPanel createprogress private JPanel createprogress(jpanel panel, JProgressBar progress) { TitledBorder border = BorderFactory. createtitledborder("computations"); panel.setborder(border); panel.add(progress); return panel; lec06/mybarpanel Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 13 / 42

MyBarPanel createstatusbar private JTextField createstatusbar(string initmessage ) { JTextField statusbar = new JTextField(); statusbar.seteditable(false); statusbar.settext(initmessage); statusbar.sethorizontalalignment(jtextfield.left); statusbar.setmaximumsize( new Dimension( Integer.MAX_VALUE, statusbar.getpreferredsize().height )); return statusbar; lec06/mybarpanel Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 14 / 42

MyBarPanel grafické rozhraní Pro oživení tlačítek musíme vytvořit reakce na události a propojit grafické rozhraní s modelem výpočetní části. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 15 / 42

Model-View-Controller (MVC) Architektura pro návrh aplikace s uživatelským rozhraním Rozděluje aplikaci na tři základní nezávislé komponenty Datový model aplikace Uživatelské rozhraní Řídicí logika Nezávislé ve smyslu, že změna některé komponenty má minimální vliv na komponenty ostatní http://www.oracle.com/technetwork/articles/javase/index-142890.html youtube Elementary Model View Controller (MVC) by Example https://www.youtube.com/watch?v=libdze_djn4 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 16 / 42

MVC Obecný princip Model datová reprezentace, se kterou aplikace pracuje View (pohled) zajišťuje vizualizaci dat aplikace do podoby vhodné k prezentaci Controller (řadič) zajišťuje změny dat nebo vizualizace na základě událostí (typicky od uživatele) Oddělení modelu od vizualizace je klíčové Umožňuje sdílení kódu a jeho snadnou údržbu Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 17 / 42

MVC Příklad průběhu 1. Uživatel stiskne tlačítko v GUI 2. Řadič (controller) je informován o události 3. Řadič provede příslušnou akci a přistoupí k modelu, který modifikuje 4. Model zpracuje požadavek od řadiče 5. Pohled (view) provede zobrazení aktualizovaného modelu Např. použitím návrhového vzoru Observer nebo notifikací od řadiče. 6. Uživatelské rozhraní čeká na další akci uživatele Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 18 / 42

Zpracování událostí Událost je objekt, který vznikne změnou stavu zdroje Důsledek interakce uživatele s řídicími elementy GUI Událost vznikne kliknutím na tlačítko stiskem klávesy posunem kurzoru (myši) Události jsou produkovány tzv. producenty což jsou tlačítka, rámy, grafické prvky Na události reagují posluchači událostí což jsou metody schopné zpracovat událost Posluchači se registrují u producentů pro odběr zpráv Java obsahuje promyšlený a konzistentní koncept vzniku a zpracování události Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 19 / 42

Sekvenční vs událostmi řízené programování Sekvenční programování kód je vykonáván postupně dle zadaného pořadí Program začíná voláním main a pokračuje sekvenčně podle větvení v řídicích strukturách (if, while,... ) Uživatelský vstup blokuje aplikaci dokud není zadán Neumožňuje čekat na vstup z více zdrojů (např. klávesnice a myši) Událostmi řízené programování (Event-driven programming) kód je vykonáván na základě aktivace nějakou událostí Systém čeká na akci uživatele Událost spouští odpovídající akci Událostmi řízené programování řeší Jak současně čekat na události z více zdrojů Co dělat pro konkrétní událost Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 20 / 42

Event-driven programming základní koncept Základní koncept je postaven na frontě zpráv Operační systém spolu se správcem oken zpracovává vstupní události z připojených zařízení Pohyb myší, stisk klávesy Správce oken identifikuje příslušné okno a aplikace, které patří událost a přepošle ji do aplikace Aplikace (Swing) používá podobný mechanismus pro identifikaci, která komponenta obdrží příslušnou zprávu Event queue Application Operating Application object System Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 21 / 42

Zpracování událostí koncepce Informace o události (zdroj události, poloha kurzoru, atd.) jsou shromážděny v objektu jehož třída určuje charakter události: ActionEvent událost generovaná tlačítkem WindowEvent událost generovaná oknem MouseEvent událost generovaná myší Všechny třídy událostí jsou následovníky třídy ActionEvent a jsou umístěny v balíku java.awt.event. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 22 / 42

Základní princip zpracování události Události jsou generovány zdroji událostí Jsou to objekty nesoucí informaci o události Události jsou přijímány ke zpracování posluchači událostí Objekty tříd s metodami schopnými událost zpracovat Zdroj události rozhoduje o tom, který posluchač má reagovat Registruje si svého posluchače Producer Events Listener Registred listener Events processing Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 23 / 42

Model šíření událostí Události jsou předávány posluchačům, které nejprve musí producent zaregistrovat Například addactionlistener(), addwindowlistener(), addmouselistener() Producent vysílá událost jen těm posluchačům, které si sám zaregistroval Posluchač musí implementovat některé z rozhraní posluchačů (tj. schopnost naslouchat) ActionListener, WindowListener, MouseListener Zatímco událost producenta je typicky objekt některé knihovní třídy (např. tlačítka), posluchač je objekt, jehož třída je deklarována v aplikaci Registrace metodou add*?listener() Registrovaná třída musí implementovat rozhraní *?Listener Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 24 / 42

Příklad posluchače Registrujeme obsluhu události tlačítka #3 Využijeme k tomu anonymní vnitřní třídu (odvozenou od ActionListener) Třídu (objekt) posluchače registrujeme metodou addactionlistener btn3.addactionlistener(new ActionListener() { @Override public void actionperformed(actionevent e) { btn3.settext("clicked"); ); Musíme implementovat všechny metody abstraktní třídy. S výhodou můžeme využít automatického generování vývojového prostředí. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 25 / 42

Příklad posluchače jako vnitřní třídy public class MyBarPanel extends JPanel {... private class SimpleButtonListener implements ActionListener { final String msg; public SimpleButtonListener(String msg) { this.msg = msg; @Override public void actionperformed(actionevent e) { status.settext(msg);... Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 26 / 42

Příklad Instancí třídy posluchače můžeme vytvořit více private JPanel createbuttons(jpanel panel) {... btn1.addactionlistener(new SimpleButtonListener( "Button #1 pressed")); btn2.addactionlistener(new SimpleButtonListener( "Button #2"));... Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 27 / 42

Implementace modelu událostí Posluchač události musí implementovat příslušné rozhraní Implementovat příslušné abstraktní metody rozhraní Pro každý druh události je definována abstraktní metoda handler, která událost ošetřuje actionperformed, mouseclicked, windowclosing,... Handlery jsou deklarovány v rozhraní posluchači ActionListener, MouseListener, WindowListener,... Předání události posluchači ve skutečnosti znamená vyvolání činnosti handleru, Objekt události je předán jako skutečný parametr handleru Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 28 / 42

Registrace posluchače Producent registruje posluchače zavoláním registrační metody: addactionlistener, addmouselistener, addwindowlistener,... Vazba mezi producentem a posluchačem je vztah N:M Jeden posluchač může být registrován u více producentů U jednoho producenta může být registrováno více posluchačů Událost se předá všem posluchačům, avšak pořadí zpracování není zaručeno Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 29 / 42

Příklad Posluchač může mít svůj vlastní stav private class ToggleButtonListener implements ActionListener { final String msg; boolean state; public ToggleButtonListener(String msg) { this.msg = msg; state = false; @Override public void actionperformed(actionevent e) { state =!state; status.settext( msg + " " + (state? "On" : "Off") ); MVC? Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 30 / 42

Příklad Zdroj může mít více posluchačů... btn1.addactionlistener(new SimpleButtonListener( "Button #1 pressed")); btn2.addactionlistener(new ToggleButtonListener( "Button #2")); ButtonListener buttonlistener = new ButtonListener(); btn1.addactionlistener(buttonlistener); btn4.addactionlistener(buttonlistener);... Událost se předá všem posluchačům, pořadí však není zaručeno Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 31 / 42

Příklad Více zdrojů téže události a jeden posluchač private class ButtonListener implements ActionListener { int count = 0; @Override public void actionperformed(actionevent e) { count += 1; JButton btn = (JButton) e.getsource(); System.out.println("BtnLst: event: " + e); System.out.println("BtnLst e.getsource: " + e.getsource()); System.out.println("ActionCommand: " + e.getactioncommand()); status.settext("btnlst: received new event " + count + " from " + btn.gettext());... ButtonListener buttonlistener = new ButtonListener(); btn1.addactionlistener(buttonlistener); btn4.addactionlistener(buttonlistener);... Zdroj události můžeme rozlišit podle textu nebo podle objektu (přetypování). Výhodnější je však vytvořit individuální posluchače. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 32 / 42

Události myši progress.addmouselistener(new MouseListener() { @Override public void mouseentered(mouseevent e) { border.settitle("mouse entred to the bar area"); panel.repaint(); // force update titledborder @Override public void mouseexited(mouseevent e) { border.settitle("computations"); panel.repaint(); // force update titledborder @Override public void mouseclicked(mouseevent e) { @Override public void mousepressed(mouseevent e) { @Override public void mousereleased(mouseevent e) { ); Události pohybu myši lze naslouchat prostřednictvím rozhraní MouseMotionListener s vlastnostmi mousedragged a mousemoved Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 33 / 42

Příklad Aktualizace průběhu výpočtu private void updateprogress() { if (computation!= null) { bar.setvalue(computation.getprogress()); private JPanel createbuttons(jpanel panel) { JButton btn1 = new JButton("#1");... btn1.addactionlistener(new ActionListener() { @Override public void actionperformed(actionevent e) { if (computation!= null) { computation.setvalue(10); updateprogress(); ); Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 34 / 42

Příklad Propojení na model a výpočet private class ComputeListener implements ActionListener { @Override public void actionperformed(actionevent e) { status.settext("start computation"); if (computation!= null) { // computation.compute(); computation.restartcomputation(); while (!computation.computepart()) { updateprogress(); updateprogress(); status.settext("computation done"); Pro nezávislý běh výpočtu a vizualizace potřebujeme více vláknovou aplikaci. (PJV 7. přednáška) Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 35 / 42

Vnitřní třídy Logické seskupení tříd, které se používají jen v jednom konkrétním místě Třídy posluchačů jsou využitelné pro producenty v GUI Efektivita kódu Princip pomocné třídy Princip zapouzdření (třída B je vnitřní třídou vnější třídy A) Třída B má přístup ke všem členům třídy A, které však mají být nepřístupné jiným třídám (jsou deklarovány jako private) Je-li B vnitřní třídou A, pak členy private třídy jsou přístupné i třídě B. Třída B je skryta mimo třídu A Metody třídy A nemají přístup k proměnným a metodám třídy B Zvýšení čitelnosti kódu a zlepšení údržby kódu http://docs.oracle.com/javase/tutorial/java/javaoo/nested.html Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 36 / 42

Příklad vnitřní třídy public class OutClass {... private class InnerClass { final String msg; public InnerClass(String msg) { this.msg = msg;... Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 37 / 42

Vnitřní třídy přehled Prvkem třídy může být jiná třída vnořená/vnitřní třída Třída, která obsahuje vnořenou třídu vnější třída Vnitřní třída Statická vnořená třída static Nemůže přímo přistupovat k instančním členům vnější třídy, musí vytvořit její instanci, přes ni má pak přístup V podstatě se chová jako běžná statická třída, jen přístup je k ním přes jméno vnější třídy Vnitřní třída (bez static) Má přístup ke všem členům vnější třídy včetně prvků private Má své vlastní proměnné a metody Nemá statické členy Vnější třída může do vnitřní jen přes její instanci Vnitřní třída není přístupná vně definice vnější třídy, jen v rámci vnější třídy Pokud nepotřebujeme jméno vnitřní třídy, můžeme použít anonymní vnitřní třídu. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 38 / 42

Příklad anonymní vnitřní třídy btn3.addactionlistener(new ActionListener() { @Override public void actionperformed(actionevent e) { btn3.settext("clicked"); ); Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 39 / 42

Final vs. effectively final Vnořená/vnitřní třída může přistupovat pouze na final proměnné vnější třídy final proměnná je taková, která se po přiřazení již nemění Java 8 přináší tzv. effectively final proměnné, tzn. automaticky považuje proměnné, které se v programu nemění za final Nemusíme je tedy explicitně deklarovat klíčovým slovem final, ale při změně obsahu dostaneme chybu. Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 40 / 42

Diskutovaná témata Shrnutí přednášky Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 41 / 42

Diskutovaná témata Diskutovaná témata GUI v Javě návrhář a programově definované grafické rozhraní Model-View-Controller Event-Driven Programming Události v Javě (Swing) Vnitřní třída a anonymní třída Model-Pohled-Řadič Událostmi řízené programování Příště: Vlákna Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 42 / 42