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

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

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

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

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

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

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

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

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

Výčtové typy a kolekce v Javě, generické typy

Výčtové typy Kolekce a JFC Iterátory Přehled JFC Generické typy

Výčtové typy Kolekce a JFC Iterátory Přehled JFC Generické typy Příklad - Spojový seznam

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.

Výčtové typy a kolekce v Javě, generické typy

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.

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.

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Í

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

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

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.

JAVA GUI Java, zimní semestr

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

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

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

typová konverze typová inference

Spojové struktury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 10 A0B36PR1 Programování 1

8. Grafické uživatelské rozhraní

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

Generické programování

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

Část I Spojové struktury

JAVA Unit testing Java, zimní semestr

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

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

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

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

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

Úvod do programovacích jazyků (Java)

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

boolean hasnext() Object next() void remove() Kolekce

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

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

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

Teoretické minimum z PJV

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

Abstraktní datové typy: zásobník

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

Iterator & for cyklus

Soubory. Katedra po íta. Ji í Vok ínek. P edná²ka 4 B6B36PJV Programování v JAVA. Fakulta elektrotechnická ƒeské vysoké u ení technické v Praze

RMI Remote Method Invocation

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

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

GUI. JavaFX. Java UI, letní semestr 2017/2018 1

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

1. Programování proti rozhraní

20. Projekt Domácí mediotéka

Programování v Javě I. Leden 2008

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

UJO Framework. revoluční architektura beans. verze

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

Abstraktní třída a rozhraní

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

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

2 Grafický výstup s využitím knihovny

9. Polymorfismus a rozhraní

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

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

7. Dynamické datové struktury

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

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

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

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

Programátorská příručka

Java pro programátory.net

Algoritmizace a programování

Výčtový typ strana 67

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

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

Jazyk C# (seminář 6)

Datové struktury. alg12 1

Java pro programátory.net

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

Seminář Java IV p.1/38

Práce se soubory v Javě

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

Abstract Factory úvod

Dědičnost (inheritance)

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

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

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

KTE / ZPE Informační technologie

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

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

7 Jazyk UML (Unified Modeling Language)

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

Transkript:

Část 1 Příklad - Generické typy, iterátor Část 2 Jan Faigl Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Přednáška 3 A0B36PR2 Programování 2 Generické typy Příklad - Spojový seznam a vlastní iterátor (opakování) Příklad - Spojový seznam a generický typ GUI komponenty a kontejnery Dialogová okna Události a obsluha událostí z GUI Jan Faigl, 2016 A0B36PR2 Přednáška 3: 1 / 56 Část I Příklad - Generické typy, iterátor Jan Faigl, 2016 A0B36PR2 Přednáška 3: 2 / 56 Generické typy a nevýhody polymorfismu Flexibilita (znovupoužitelnost) tříd je tradičně v Javě řešena dědičností a polymorfismem Polymorfismus nám dovoluje vytvořit třídu (např. nějaký kontejner), která umožňuje uložit libovolný objekt (jako referenci na objekt typu Object) Např. ArrayList z JFC Dynamická vazba polymorfismu však neposkytuje kontrolu správného (nebo očekávaného) typu během kompilace Případná chyba v důsledku špatného typu se tak projeví až za běhu programu Tato forma polymorfismu také vyžaduje explicitní přetypování objektu získaného z obecné kolekce Například zmiňovaný ArrayList pro ukládání objektů typu Object. Jan Faigl, 2016 A0B36PR2 Přednáška 3: 3 / 56 Příklad použití kolekce ArrayList package cz.cvut.fel.pr2; import java.util.arraylist; public class Simulator { World world; ArrayList participants; Simulator(World world) { this.world = world; participants = new ArrayList(); public void nextround() { for (int i = 0; i < participants.size(); ++i) { Participant player = (Participant) participants.get(i); Bet bet = world.dostep(player); Explicitní přetypování (Participant) je nutné. Jan Faigl, 2016 A0B36PR2 Přednáška 3: 4 / 56 Generické typy Java 5 dovoluje použít generických tříd a metod Generický typ umožňuje určit typ instance tříd, které lze do kolekce ukládat Generický typ tak poskytuje statickou typovou kontrolu během překladu Generické typy představují parametrizované definice třídy typu nějaké datové položky Parametr typu se zapisuje mezi <>, například List<Participant> partlist = new ArrayList<Participant>(); http://docs.oracle.com/javase/tutorial/java/generics/index.html Jan Faigl, 2016 A0B36PR2 Přednáška 3: 6 / 56 Příklad použití parametrizované kolekce ArrayList package cz.cvut.fel.pr2; import java.util.arraylist; public class Simulator { World world; ArrayList<Participant> participants; Simulator(World world) { this.world = world; participants = new ArrayList(); public void nextround() { for (int i = 0; i < participants.size(); ++i) { Participant player = participants.get(i); Bet bet = world.dostep(player); Explicitní přetypování (Participant) není nutné Jan Faigl, 2016 A0B36PR2 Přednáška 3: 7 / 56 Příklad generický a negenerický typ ArrayList participants; participants = new ArrayList(); participants.push(new PlayerRed()); // vlozit libovolny objekt je mozne participants.push(new Bet()); ArrayList<Participant> participants2; participants2 = new ArrayList<Participant>(); participants2.push(new PlayerRed()); // nelze prelozit // typova kontrola na urovni prekladace participants2.push(new Bet()); Jan Faigl, 2016 A0B36PR2 Přednáška 3: 8 / 56 Jan Faigl, 2016 A0B36PR2 Přednáška 3: 9 / 56 Jan Faigl, 2016 A0B36PR2 Přednáška 3: 10 / 56

Příklad parametrizované třídy import java.util.list; import java.util.arraylist; class Library<E> { private List<E> resources = new ArrayList<E>(); public void add(e x) { resources.add(x); public E getlast() { int size = resources.size(); return size > 0? resources.get(size-1) : null; Jan Faigl, 2016 A0B36PR2 Přednáška 3: 11 / 56 Příklad použití Do seznamu můžeme přidávat libovolné objekty, např. String Tisk seznamu však realizuje vlastní metodou print LinkedList lst = new LinkedList(); lst.push("joe"); lst.push("barbara"); lst.push("charles"); lst.push("jill"); lst.print(); Využití konstrukce for-each vyžaduje, aby třída LinkedList implementovala rozhraní Iterable for (Object o : lst) { System.out.println("Object:" + o); Jan Faigl, 2016 A0B36PR2 Přednáška 3: 15 / 56 Příklad využití iterátoru v příkazu for-each Nahradíme implementace LinkedList za LinkedListIterable // LinkedList lst = new LinkedList(); LinkedListIterable lst = new LinkedListIterable(); lst.push("joe"); lst.push("barbara"); lst.push("charles"); lst.push("jill"); lst.print(); for (Object o : lst) { System.out.println("Object:" + o); lec03/linkedlistdemo Generické metody Generické metody mohou být členy generických tříd nebo normálních tříd public class Methods { public <T> void print(t o) { System.out.println("Print Object: " + o); public static void main(string[] args) { Integer i = 10; Double d = 5.5; Methods m1 = new Methods(); m1.print(i); m1.print(d); m1.<integer>print(i); /// nelze -- typova kontrola m1.<integer>print(d); lec03/methods Jan Faigl, 2016 A0B36PR2 Přednáška 3: 12 / 56 Rozhraní Iterable a Iterator Rozhraní Iterable předepisuje metodu iterator, která vrací iterátor instanci třídy implementující rozhraní Iterator Iterator je objekt umožňující postupný přístup na položky seznamu Rozšíříme třídu LinkedList o implementaci rozhraní Iterable a vnitřní třídu LLIterator implementující rozhraní Iterator http://docs.oracle.com/javase/tutorial/java/javaoo/innerclasses.html public class LinkedListIterable extends LinkedList implements Iterable { private class LLIterator implements Iterator {... public Iterator iterator() { return new LLIterator(start); //kurzor <- start lec03/linkedlistiterable Jan Faigl, 2016 A0B36PR2 Přednáška 3: 16 / 56 Spojový seznam specifických objektů Do spojového seznamu LinkedList můžeme ukládat libovolné objekty, což má i přes své výhody také nevýhody: Nemáme statickou typovou kontrolu prvků seznamu Musíme objekty explicitně přetypovat, například pro volání metody tonicestring objektu Person public class Person { private final String name; private final int age; public Person(String name, int age) {... public String tonicestring() { return "Person name: " + name + " age: " + age; Příklad implementace spojového seznamu Třída LinkedList pro uchování objektů Implementujeme metody push a print public class LinkedList { class ListNode { ListNode next; Object item; ListNode(Object item) {... ListNode start; public LinkedList() {... public LinkedList push(object obj) {... public void print() {... lec03/linkedlist Jan Faigl, 2016 A0B36PR2 Přednáška 3: 14 / 56 Implementace rozhraní Iterator Rozhraní Iterator předepisuje metody hasnext a next private class LLIterator implements Iterator { private ListNode cur; private LLIterator(ListNode cur) { this.cur = cur; // nastaveni kurzoru public boolean hasnext() { return cur!= null; public Object next() { if (cur == null) { throw new NoSuchElementException(); Object ret = cur.item; cur = cur.next; //move forward return ret; lec03/linkedlistiterable Jan Faigl, 2016 A0B36PR2 Přednáška 3: 17 / 56 Příklad přetypování na Person LinkedListIterable lst = new LinkedListIterable(); lst.push(new Person("Joe", 30)); lst.push(new Person("Barbara", 40)); lst.push(new Person("Charles", 50)); lst.push(new Person("Jill", 60)); for (Object o : lst) { System.out.println("Object: " + ((Person)o). tonicestring()); Jan Faigl, 2016 A0B36PR2 Přednáška 3: 18 / 56 Jan Faigl, 2016 A0B36PR2 Přednáška 3: 20 / 56 Jan Faigl, 2016 A0B36PR2 Přednáška 3: 21 / 56

Generický typ Využitím generického typu můžeme předepsat konkrétní typ objektu Vytvoříme proto LinkedList přímo jako generický typ deklarací class LinkedListGeneric<E> a záměnou Object za E %s/object/e public class LinkedListGeneric<E> { class ListNode { ListNode next; E item; ListNode(E item) {... ListNode start public LinkedListGeneric() {... public LinkedListGeneric push(e obj) {... public void print() {... lec03/linkedlistgeneric Jan Faigl, 2016 A0B36PR2 Přednáška 3: 22 / 56 Příklad použití LinkedListGenericIterable<Person> lst = new LinkedListGenericIterable(); lst.push(new Person("Joe", 30)); lst.push(new Person("Barbara", 40)); lst.push(new Person("Charles", 50)); lst.push(new Person("Jill", 60)); lst.print(); for (Person o : lst) { System.out.println("Object: " + o.tonicestring()); lec03/linkedlistgenericdemo Generický typ Iterable a Iterator Podobně upravíme odvozený iterátor a doplníme typ také v rozhraní Iterable a Iterator public class LinkedListGenericIterable<E> extends LinkedListGeneric<E> implements Iterable<E> { // vnitni trida pro iterator private class LLIterator implements Iterator<E> {... public Iterator iterator() { return new LLIterator(start); lec03/linkedlistgenericiterable Jan Faigl, 2016 A0B36PR2 Přednáška 3: 23 / 56 Část II Generický typ Iterator Implementace iterátoru je identická jako v případě LinkedListIterable private class LLIterator implements Iterator<E> { private ListNode cur; private LLIterator(ListNode cur) { this.cur = cur; public boolean hasnext() { return cur!= null; public E next() { if (cur == null) { throw new NoSuchElementException(); E ret = cur.item; cur = cur.next; //move forward return ret; lec03/linkedlistgenericiterable Jan Faigl, 2016 A0B36PR2 Přednáška 3: 24 / 56 Grafické uživatelské rozhraní GUI Graphical User Interface Zásadním způsobem ovlivňuje použitelnost, přívětivost aplikace a také produktivitu User experience Elegantní návrh s intuitivní a konzistentní funkcionalitou Respektujte styl a zvyklosti uživatele Cílová skupina laik vs expert Jednoduchost bývá zpravidla lepší než složité komponenty Vytvořit jednoduché a dobře použitelné rozhraní je zpravidla výrazně časově náročnější než se na první pohled zdá. Klíčová je zpětná vazba od uživatelů a testování Testováno na lidech! Návrh dobrého rozhraní je o rozložení grafických prvků, volbě barev a tvarů, vizualizačních efektech, písmu,... V rámci PR2 si ukážeme jaké základní prvky (objekty) se pro tvorbu GUI používají. Jan Faigl, 2016 A0B36PR2 Přednáška 3: 25 / 56 Programování a tvorba grafického rozhraní Z programátorského hlediska se však vždy v podstatě jedná o zadání vstupu a prezentaci výstupu Pro interakci s uživatelem lze využít sadu základních grafických komponent tzv. Widgets Softwarová knihovna pro tvorbu rozhraní se nazývá Widget toolkit nebo grafický toolkit Klíčem k jednoduchosti, použitelnosti a také přenositelnosti mezi platformami je unifikace grafických prvků Různé systémy, různé grafické reprezentace. Velkou výhodou Javy je, že knihovny pro grafické prvky jsou součástí standardního JDK Jan Faigl, 2016 A0B36PR2 Přednáška 3: 29 / 56 Jan Faigl, 2016 A0B36PR2 Přednáška 3: 26 / 56 Grafické knihovny v Javě AWT Abstract Window ToolKit (První gui v Javě heavyweight) Vykreslování zajišťuje hostitelská platform, na které běží JVM Vykreslování je tak rychlejší, ale vše nemusí fungovat identicky na jiných platformách Swing Výrazné rozšíření (a zlepšení) GUI (oproti AWT) Doporučené standardní Look&Feel je platformově nezávislý a respektuje i18n i18n i-internationalizatio-n Důsledné oddělení modelu od pohledu http://docs.oracle.com/javase/tutorial/uiswing JavaFX nový GUI ToolKit (následovník Swing) Témata vzhledu Přes CSS Obsahuje HMTL rendering engine Založen na WebKit http://docs.oracle.com/javase/8/javase-clienttechnologies.htm SWT Standard Widget Tookit (Eclipse) Platformově závislý, ale unifikuje vzhled https://www.eclipse.org/swt Jan Faigl, 2016 A0B36PR2 Přednáška 3: 30 / 56 Jan Faigl, 2016 A0B36PR2 Přednáška 3: 28 / 56 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í Jan Faigl, 2016 A0B36PR2 Přednáška 3: 32 / 56

AWT a Swing Základní součásti GUI Přehled základních grafických komponent AWT [AWT Components] [AWT Containers] Window [java.lang.] Object Component Container SWING [javax.swing.] JComponent [javax.swing.] [Swing components] [javax.swing] JWindow Komponenty a dialogové prvky javax.swing Tlačítka, text, textová pole, seznamy, přepínače Společné metody pro velikost, barvu, umístění textu,... Kontejnery (v oknech, která zpravidla řeší prostředí OS) javax.swing Kontejnery obsahují komponenty Komponenty musí být umístěny v kontejneru Kontejnery se vkládají do oken JFrame obecný kontejner JPanel kontejner po jednoduché komponenty Layout Manager Správce rozmístění javax.swing a java.awt Definuje pozici komponent v kontejneru Relativní k okrajům, pevná pozice, v mřížce,... Určuje vzhled a chování aplikace Events Obsluha událostí (java.awt.event) Komponenty JLabel Zobrazení popisku, bez generování události JButton Tlačítko s událostí kliknutí na tlačítko JTextField Zadání textu JPasswordField Zadání textu (hesla), vložené znaky se zobrazují jako hvězdičky JList Seznam položek, možnost vybrat jednu nebo více položek JComboBox Rozevírací seznam položek, klepnutím na položku se generuje událost JCheckBox Zaškrtávací políčko, prvek je/není vybrán JRadioButton Přepínač, výběr z možností Jan Faigl, 2016 A0B36PR2 Přednáška 3: 33 / 56 Kontejnery a správce rozvržení Jan Faigl, 2016 A0B36PR2 Přednáška 3: 34 / 56 Správci rozmístění komponent Layout Manager Jan Faigl, 2016 A0B36PR2 Přednáška 3: 35 / 56 Příklad okna a vložení komponenty (JLabel) JFrame Kontejner s ohraničením a záhlavím http://docs.oracle.com/javase/tutorial/uiswing/components/frame.html JPanel Kontejner bez ohraničení, implicitně rozmístění FlowLayout Může být jednodušší na použití http://docs.oracle.com/javase/tutorial/uiswing/components/panel.html Layout Manager (správce rozvržení) BorderLayout Rozmístění podle okrajů okna (panelu/kontejneru) BoxLayout Rozmístění do podkontejnerů, sdružování komponent FlowLayout Rozmístění zleva doprava a shora dolů GridLayout Rozmístění do pevné mřížky 0 3 1 5 4 FlowLayout 0 1 2 3 4 5 2 1 West 0 North 2 Center 4 South BorderLayout 3 East JFrame Swing Hello World // okno a jeho titulek JFrame frame = new JFrame("HelloWorldSwing"); frame.setdefaultcloseoperation(jframe.exit_on_close); JLabel label = new JLabel("Hello World"); frame.getcontentpane().add(label, BorderLayout.NORTH); frame.pack(); //nastav velikost okna frame.setvisible(true); //zobrazi okno Metoda demo v lec03/demoguicomponents http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html GridLayout GridBagLayout Jan Faigl, 2016 A0B36PR2 Přednáška 3: 36 / 56 Řídicí komponenty 1/2 Tlačítka JButton zvonková JToggleButton přepínací JCheckBox zaškrtávací JRadioButton a ButtonGroup http://docs.oracle.com/javase/tutorial/uiswing/components/button.html JList seznam SINGLE_SELECTION, SINGLE_INTERVAL_SELECTION, MULTIPLE_INTERVAL_SELECTION http://docs.oracle.com/javase/tutorial/uiswing/components/list.html JComboBox seznam rozbalovací http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html lec03/demoguicomponents Jan Faigl, 2016 A0B36PR2 Přednáška 3: 39 / 56 Jan Faigl, 2016 A0B36PR2 Přednáška 3: 37 / 56 Řídicí komponenty 2/2 JTextField vstupní pole pro data (editovatelné nebo needitovatelné) TextArea http://docs.oracle.com/javase/tutorial/uiswing/components/textfield.html JMenuBar, JMenu, JMenuItem JRadioButtonMenuItem, ButtonGroup http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html JSlider http://docs.oracle.com/javase/tutorial/uiswing/components/slider.html lec03/demoguicomponents Jan Faigl, 2016 A0B36PR2 Přednáška 3: 40 / 56 Jan Faigl, 2016 A0B36PR2 Přednáška 3: 38 / 56 Vlastní grafika v Javě Plátno (Canvas) Základní třídy java.awt.graphics, java.awt.graphics2d Základní možnosti třídy Graphics: Již od JDK ver. 1.2 Kreslení základních 2D objektů (grafických primitiv) Vykreslování textu a obrázků Nastavování a testování barev, fontů, ořezání,... Okamžik zobrazení není časově určen Kreslit lze v komponentách JPanel a JFrame Vykreslování probíhá v grafickém kontextu tvořeného třídou Graphics Grafický kontext je parametrem (zděděné) metody Container.paint(Graphics g), ve které probíhá vlastní kreslení do kontextu ( plátna ) Definuje počáteční vykreslení, nevolá se přímo Třída Graphics je abstraktní, předávaný objekt g je automatický objekt, o který se nestaráme. Překreslování je realizováno metodami repaint a update http://docs.oracle.com/javase/tutorial/uiswing/painting Jan Faigl, 2016 A0B36PR2 Přednáška 3: 41 / 56

Příklad vykreslení grafických primitiv 1/3 public class Canvas extends JFrame { public Canvas() { settitle("pr2 Demo Canvas"); setsize(640, 480); setvisible(true); setdefaultcloseoperation(jframe.exit_on_close); public void paint(graphics g) {... lec03/canvas Jan Faigl, 2016 A0B36PR2 Přednáška 3: 42 / 56 Dialogové okno Dialogové okno je dočasné nezávislé okno zpravidla vyžadující interakci uživatele Slouží pro informování uživatele nebo pro získání uživatelské vstupu http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html Je možné je vyvolat metodami třídy JOptionPane, např. showmessagedialog showconfirmdialog showinputdialog Jan Faigl, 2016 A0B36PR2 Přednáška 3: 46 / 56 Modalita dialogových oken Modalita dialogu určuje, zdali dialogové okno blokuje ostatní okna Dialog.ModalityType APPLICATION_MODAL DOCUMENT_MODAL MODELESS TOOLKIT_MODAL Volíme dle typu aplikace a dialogu např.: Jedno hlavní okno, ostatní dialogová okna slouží pro zadání vstupu nebo informování uživatele (např. výběr souboru), po uzavření přecházíme do hlavního okna Více hlavních oken, kterými procházíme a vždy pracujeme pouze s jedním oknem Více plovoucích nezávislých oken Modeless http://docs.oracle.com/javase/tutorial/uiswing/misc/modality.html Příklad vykreslení grafických primitiv 2/3 public void paint(graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setcolor(color.red); g2d.filloval(110, 210, 30, 30); g2d.drawoval(360, 320, 30, 30); g2d.setcolor(color.blue); g2d.fillrect(150, 50, 30, 30); g2d.drawpolygon( new int[]{200, 250, 300, 290, 180, new int[]{150, 200, 180, 210, 240, 5); g2d.draw(new Ellipse2D.Double(320, 240, 30, 30)); lec03/canvas Jan Faigl, 2016 A0B36PR2 Přednáška 3: 43 / 56 Příklad dialogového okna import javax.swing.joptionpane; JOptionPane.showMessageDialog(null, "Message"); int answr = //0 - Yes, 1 - No, 2 - Cancel JOptionPane.showConfirmDialog(null, "Config?"); String str = JOptionPane.showInputDialog(null, "Entry"); lec03/demodialog Jan Faigl, 2016 A0B36PR2 Přednáška 3: 47 / 56 Příklad modálního a nemodálního okna final JFrame parent = new JFrame("Parent Frame"); parent.setlayout(new FlowLayout()); parent.setdefaultcloseoperation(jframe.exit_on_close); parent.setbounds(100, 100, 300, 200); parent.add(new JButton("Button")); parent.setvisible(true); JDialog dialog1 = new JDialog(parent, "Modeless Dialog"); dialog1.setbounds(200, 200, 300, 200); dialog1.setvisible(true); JDialog dialog2 = new JDialog(parent, "Document-Modal Dialog", Dialog.ModalityType.DOCUMENT_MODAL); dialog2.setbounds(300, 300, 300, 200); dialog2.setvisible(true); lec03/demomodality Příklad vykreslení grafických primitiv 3/3 public class DemoGuiCanvas { public void demo() { Canvas canvas = new Canvas(); canvas.show(); public static void main(string[] args) { DemoGuiCanvas gui = new DemoGuiCanvas(); gui.demo(); lec03/demoguicanvas Jan Faigl, 2016 A0B36PR2 Přednáška 3: 44 / 56 Dialog zobrazení informace Zobrazení informace můžeme anotovat podle významu ERROR_MESSAGE INFORMATION_MESSAGE WARNING_MESSAGE QUESTION_MESSAGE PLAIN_MESSAGE int response = JOptionPane.showConfirmDialog(null, "PR2 is great! Isn t it?"); switch (response) { case 0: JOptionPane.showMessageDialog(null, "You are right!", "Confirm", JOptionPane.PLAIN_MESSAGE); break; case 1: JOptionPane.showMessageDialog(null, "You are wrong!", "Error", JOptionPane.ERROR_MESSAGE); break; case 2: JOptionPane.showMessageDialog(null, "You should know!", "Warn", JOptionPane.WARNING_MESSAGE); break; lec03/demodialog Jan Faigl, 2016 A0B36PR2 Přednáška 3: 48 / 56 Zpracování událostí Interakce uživatele s rozhraním vyvolává události, na které je potřeba reagovat Dialogová okna (modální) představují synchronní mechanismus, kdy je běh aplikace pozastaven a aplikace čeká na uživatelský vstup Zpravidla, chceme uživatelům umožnit vyšší interaktivitu a s tím související nezávislé generování událostí Generované události je však nutné zpracovávat Jan Faigl, 2016 A0B36PR2 Přednáška 3: 49 / 56 Jan Faigl, 2016 A0B36PR2 Přednáška 3: 50 / 56 Jan Faigl, 2016 A0B36PR2 Přednáška 3: 52 / 56

Diskutovaná témata Obsluha událostí Mechanismus reakce na akci uživatele, např. Stisk tlačítka, zadání textu, pohyb kurzoru Množinu možných typů událostí definuje Toolkit a souvisí s rozhraním (uživatelským) počítače Pro každou komponentu je nutné 1. Deklarovat typ zachytávané událost, kterou chceme zpracovávat 2. Určit posluchače, který má událost obsloužit Akcí uživatele vznikne událost, která je objektem Javy Zachycené události jsou zpracovány (obslouženy) posluchači (listener) Třídami s uživatelskými metodami pro reakci na událost posluchači, které implementují rozhraní naslouchání Tj. musejí mít schopnost naslouchat dané události Obsluha souvisí s tzv. Event-driven programováním, které je náplní 4. přednášky Příklad zpracování stisku tlačítka JFrame frame = new JFrame("PR2 - GUI button click demo"); Container pane = frame.getcontentpane(); JButton printbutton = new JButton("Print"); printbutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.out.println("User click to print"); ); JButton exitbutton = new JButton("Quit"); exitbutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.out.println("User click to exit"); System.exit(0); ); pane.add(printbutton); pane.add(exitbutton); lec03/demobuttonevent Shrnutí přednášky Jan Faigl, 2016 A0B36PR2 Přednáška 3: 53 / 56 Diskutovaná témata Diskutovaná témata Jan Faigl, 2016 A0B36PR2 Přednáška 3: 54 / 56 Jan Faigl, 2016 A0B36PR2 Přednáška 3: 55 / 56 Kolekce Java Collection Framework (JFC) generické typy Komponenty a kontejnery Dialogová okna (modalita) Události a obsluha událostí (nástin) Příště: a událostmi řízené programování (Even-Driven Programming) Jan Faigl, 2016 A0B36PR2 Přednáška 3: 56 / 56