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

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

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

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

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

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

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

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

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

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

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

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 {... }

KTE / ZPE Informační technologie

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

Generické programování

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

Datové struktury. alg12 1

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

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

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

Jazyk C# (seminář 6)

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

Algoritmizace a programování

Ú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

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

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

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

8. Grafické uživatelské rozhraní

Abstraktní datové typy: zásobník

RMI Remote Method Invocation

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

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

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

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

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

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

GUI. Systémová integrace pro desktopové aplikace

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

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

Java Výjimky Java, zimní semestr

Dědění, polymorfismus

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

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

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

Technologie JavaBeans

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

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

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

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

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

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í

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

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

První seznámení s mobilní aplikací PATRIOT GPS

7. Datové typy v Javě

UJO Framework. revoluční architektura beans. verze

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Řídicí struktury. alg3 1

Programovací jazyk Java

Úvod do programovacích jazyků (Java)

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 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 1 / 42 Základní prvky grafického rozhraní Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 2 / 42 Základní komponenty 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 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 3 / 42 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 4 / 42

Návrhář formulářů 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 5 / 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 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 6 / 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 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 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 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() { 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 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 13 / 42 MyBarPanel grafické rozhraní Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 14 / 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 Pro oživení tlačítek musíme vytvořit reakce na události a propojit grafické rozhraní s modelem výpočetní části. 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 15 / 42 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 16 / 42

MVC Obecný princip MVC Příklad průběhu 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é 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 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 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 18 / 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 19 / 42 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 Operating Event queue Application Application object 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. System Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 21 / 42 Základní princip zpracování události Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 22 / 42 Model šíření událostí 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 Registred listener Listener Events processing 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 23 / 42 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() { 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 Instancí třídy posluchače můžeme vytvořit více 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; status.settext(msg); Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 26 / 42 Implementace modelu událostí private JPanel createbuttons(jpanel panel) { btn1.addactionlistener(new SimpleButtonListener( "Button #1 pressed")); btn2.addactionlistener(new SimpleButtonListener( "Button #2")); 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 27 / 42 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 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 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; 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 Více zdrojů téže události a jeden posluchač private class ButtonListener implements ActionListener { int count = 0; 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() { public void mouseentered(mouseevent e) { border.settitle("mouse entred to the bar area"); panel.repaint(); // force update titledborder public void mouseexited(mouseevent e) { border.settitle("computations"); panel.repaint(); // force update titledborder public void mouseclicked(mouseevent e) { public void mousepressed(mouseevent e) { 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 Propojení na model a výpočet private class ComputeListener implements ActionListener { 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 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() { if (computation!= null) { computation.setvalue(10); updateprogress(); ); return panel; Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 34 / 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 Příklad anonymní vnitřní třídy 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 Final vs. effectively final btn3.addactionlistener(new ActionListener() { btn3.settext("clicked"); ); 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 39 / 42 Jan Faigl, Jiří Vokřínek, 2017 B0B36PJV Přednáška 6: GUI v Javě a události 40 / 42

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