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

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ě 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ě 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ů

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

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

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

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

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

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í

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

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

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

KTE / ZPE Informační technologie

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

Generické programování

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

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

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

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

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.

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

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

Algoritmizace a programování

Datové struktury. alg12 1

8. Grafické uživatelské rozhraní

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

Algoritmizace a programování

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

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

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

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

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

Abstraktní datové typy: zásobník

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

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

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

Jazyk C# (seminář 6)

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

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

Základy objektové orientace I. Únor 2010

RMI Remote Method Invocation

Úvod do programovacích jazyků (Java)

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

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

Technologie JavaBeans

Abstraktní třída a rozhraní

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

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

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

JAVA JavaBeans Java, letní semestr

Výčtový typ strana 67

GUI. Systémová integrace pro desktopové aplikace

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

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

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

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

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

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

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

Příloha 6. Palety nástrojů

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

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

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

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

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

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

Tvorba informačních systémů

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

Řídicí struktury. alg3 1

Observer. Klasifikace. Alias. Smysl. Potřeba sledování změn objektu a notifikace. Obdoba systému událostí (C#, Java) vlastními prostředky

Iterator & for cyklus

Dědění, polymorfismus

Abstraktní datové typy

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

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

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

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

Úvod do programovacích jazyků (Java)

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

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

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

Java Výjimky Java, zimní semestr

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

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

3 KTE / ZPE Informační technologie

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

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

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

Transkript:

GUI v Javě a událostmi řízené programování Jan Faigl Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Přednáška 4 A0B36PR2 Programování 2 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 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 1 / 47 Základní komponenty Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 2 / 47 Návrhář formulářů Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 4 / 47 Příklad návrhu aplikace BarComp Komponenty a dialogové prvky Tlačítka, text, textová pole, seznamy, přepínače javax.swing 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. 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 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 5 / 47 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(); lec04/demobarcomp Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 7 / 47 Struktura aplikace DemoBarComp start void start() { JFrame frame = new JFrame("PR2 - lec04 - 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()); lec04/demobarcomp Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 9 / 47 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() { Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 10 / 47 Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 11 / 47 Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 12 / 47

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); Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 13 / 47 MyBarPanel createprogress private JPanel createprogress(jpanel panel, JProgressBar progress) { TitledBorder border = BorderFactory. createtitledborder("computations"); panel.setborder(border); panel.add(progress); MyBarPanel createcontrolbuttons 1/2 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); Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 14 / 47 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; MyBarPanel createcontrolbuttons 2/2 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); Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 15 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 16 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 20 / 47 Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 17 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 21 / 47 Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 18 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 22 / 47

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 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 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 System Event queue Application Application object Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 24 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 25 / 47 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 Registred listener Listener Events processing Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 26 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 27 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 30 / 47 Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 28 / 47 Příklad posluchače jako vnitřní třídy public class MyBarPanel extends JPanel { private class SimpleButtonListener implements public SimpleButtonListener(String msg) { status.settext(msg); Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 31 / 47 Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 29 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 32 / 47

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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 33 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 36 / 47 Příklad Aktualizace průběhu výpočtu private void updateprogress() { bar.setvalue(computation.getprogress()); private JPanel createbuttons(jpanel panel) { JButton btn1 = new JButton("#1"); btn1.addactionlistener(new ActionListener() { computation.setvalue(10); ); Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 39 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 34 / 47 Příklad Více zdrojů téže události a jeden posluchač private class ButtonListener implements 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 37 / 47 Příklad Propojení na model a výpočet private class ComputeListener implements status.settext("start computation"); // computation.compute(); computation.restartcomputation(); while (!computation.computepart()) { status.settext("computation done"); Pro nezávislý běh výpočtu a vizualizace potřebujeme více vláknovou aplikaci. (PR2 5. přednáška) Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 40 / 47 Příklad Posluchač může mít svůj vlastní stav private class ToggleButtonListener implements boolean state; public ToggleButtonListener(String msg) { state = false; state =!state; status.settext( msg + " " + (state? "On" : "Off") ); MVC? Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 35 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 38 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 42 / 47

Příklad vnitřní třídy public class OutClass { private class InnerClass { public InnerClass(String msg) { Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 43 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 44 / 47 Příklad anonymní vnitřní třídy btn3.addactionlistener(new ActionListener() { btn3.settext("clicked"); ); Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 45 / 47 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, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 46 / 47 Jan Faigl, 2016 A0B36PR2 Přednáška 4: GUI v Javě a události 47 / 47