JAVA V GUI Java, zimní semestr

Podobné dokumenty
JAVA GUI Java, zimní semestr

JAVA V GUI Java, zimní semestr

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

JAVA. GUI v std knihovně. Java, letní semestr

JAVA UI. Programování uživatelských rozhraní v Javě. Java UI, letní semestr 2017/2018 1

Swing Vlákna Java, zimní semestr

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

JAVA Unit testing Java, zimní semestr

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.

Kapitola 1. Stromy 1.1. Základní informace

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 - ú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é

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

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

Čá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. Systémová integrace pro desktopové aplikace

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

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

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

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

8. Grafické uživatelské rozhraní

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

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

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

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

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

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

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

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

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

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

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

Iterator & for cyklus

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

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

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

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

JAVA JavaBeans Java, letní semestr

JAVA JavaBeans Java, letní semestr 2018

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

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

Programátorská příručka

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

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

Úvod do programovacích jazyků (Java)

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

Generické programování

Manuál k programu KaraokeEditor

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

Swing. Vlákna. Java UI, letní semestr 2017/2018 1

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

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

Jazyk C# (seminář 6)

Práce se soubory v Javě

GUI. Systémová integrace pro desktopové aplikace

JAVA Unit testing Java, zimní semestr

Abstraktní datové typy: zásobník

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

Podmínky na zápočet. Java, zimní semestr

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

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

Uživatelská rozhraní 10. cvičení. Martin Němec A

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

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

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

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

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

Programování v jazyku C# II. 3.kapitola

Programování v Javě I. Leden 2008

20. Projekt Domácí mediotéka

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

5 Rekurze a zásobník. Rekurzivní volání metody

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

Java Výjimky Java, zimní semestr

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

Chain of responsibility

Jazyk C# (seminář 3)

Technologie JavaBeans

JAVA. Java Management Extensions JMX

typová konverze typová inference

Dělení a vlastnosti komponent

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

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

Seminář Java IV p.1/38

Typický prvek kolekce pro české řazení

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

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

Administrace webu Postup při práci

Java Enum Java, zimní semestr ,2017 1

Mediator motivace. FontDialog. závislosti mezi jednotlivými ovládacími prvky jsou netriviální

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

Abstract Factory úvod

První kapitola úvod do problematiky

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

UJO Framework. revoluční architektura beans. verze

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

Transkript:

JAVA GUI 1

Přehled JDK1.0 AWT Abstract Window Toolkit cíl na všech platformách dobře vypadající GUI moc se nepovedlo různá omezení (např. jen 4 fonty) špatně se používalo "ne-objektový" přístup JDK1.1 nový "event model" objektový přístup JDK1.2 nové GUI Swing součást JFC (Java Foundation Classes) JDK 8 JavaFX nové UI, existuje už od 2009 (bylo nutno nainstalovat samostatně) 2

Swing balíky javax.swing... používají se třídy z java.awt... mnoho tříd je potomky tříd z java.awt... AWT také součást JFC stále je přítomno kompatibilita,... používá se model událostí implementace plně v Javě na všech platformách vypadá a chová se stejně vzhled i chovaní lze upravovat přizpůsobovat platformě podpora pro 2D grafiku, tisk, drag-and-drop, lokalizace,... 3

Hello World import javax.swing.*; public class HelloWorldSwing { private static void createandshowgui() { JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("HelloWorldSwing"); frame.setdefaultcloseoperation(jframe.exit_on_close); JLabel label = new JLabel("Hello World"); frame.getcontentpane().add(label); frame.pack(); frame.setvisible(true); } public static void main(string[] args) { javax.swing.swingutilities.invokelater(new Runnable() { public void run() { createandshowgui(); } }); } } 4

Hello World (2) import javax.swing.*; public class HelloWorldSwing { private static void createandshowgui() { JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("HelloWorldSwing"); frame.setdefaultcloseoperation(jframe.exit_on_close); JLabel label = new JLabel("Hello World"); frame.getcontentpane().add(label); frame.pack(); frame.setvisible(true); } public static void main(string[] args) { javax.swing.swingutilities.invokelater(new Runnable() { public void run() { createandshowgui(); } }); } } 5

Layout // příklad: cz.cuni.mff.java.gui.buttonandlabel Container pane = frame.getcontentpane(); pane.setlayout(new GridLayout(0, 1)); JButton button = new JButton("Click here"); pane.add(button); JLabel label = new JLabel("Hello World"); pane.add(label); layout určuje velikost a umístění komponent v kontejneru určuje změnu velikosti a umístění při změně velikosti kontejneru implementuje interface java.awt.layoutmanager 6

Panel a okraje // příklad: cz.cuni.mff.java.gui.buttonandlabel2 JPanel panel = new JPanel(new GridLayout(0, 1)); panel.setborder(borderfactory.createemptyborder(30, 30, 10, 30)); JButton button = new JButton("Click here"); panel.add(button); JLabel label = new JLabel("Hello World"); panel.add(label);... frame.getcontentpane().add(panel); panel "lightweigth" kontejner kontejnery se vkládají do jiných kontejnerů okraj (Border) jak vykreslovat okraje komponent (JComponent) 7

Look & Feel // příklad: cz.cuni.mff.java.gui.buttonandlabel3 String lookandfeel = UIManager.getCrossPlatformLookAndFeelClassName(); UIManager.setLookAndFeel(lookAndFeel); určuje vzhled a chování GUI L&F obsažený v JDK crossplatform (Metal) na všech platformách stejný vzhled Windows podobné Windows GUI system na Unixu metal na Windows windows Motif GTK+ od JDK 1.4.2 Nimbus od JDK 6 u10 lze vytvářet vlastní 8

Události GUI se ovládá pomocí událostí (events) př. stisknutí tlačítka událost zpracování událostí listener objekt si zaregistruje listener dostává informace o události mnoho druhů událostí (a jim odpovídající listenery) př. stisk tlačítka, zavření okna, pohyb myši,... public class ButtonAndLabel4 implements ActionListener {... JButton button = new JButton("Click here"); button.addactionlistener(this);... public void actionperformed(actionevent e) { clicks++; label.settext("hello World: "+clicks); } 9

Události jeden listener lze zaregistovat pro více událostí public class TempConvert implements ActionListener {... input = new JTextField(); convertbutton = new JButton("Preved"); convertbutton.addactionlistener(this); input.addactionlistener(this);... public void actionperformed(actionevent e) { int temp = (int) ((Double.parseDouble(input.getText())-32)*5/9); cellabel.settext(temp+" Celsius"); } } 10

Vlákna obsluha událostí a vykreslování GUI jedno vlákno (event-dipatching thread) zajišťuje postupné obsluhování událostí každá událost se obslouží až po skončení předchozí obsluhy události nepřerušují vykreslování SwingUtilities.invokeLater(Runnable dorun) statická metoda provede kód v dorun.run() pomocí vlákna obsluhujícího GUI počká se, až budou všechny události obslouženy metoda okamžitě skončí nečeká, až se kód provede používá se, pokud program upravuje GUI SwingUtilities.invokeAndWait(Runnable dorun) jako invokelater(), ale skončí, až se kód provede 11

Swing Přehled komponent 12

Label třída JLabel pro zobrazení krátkého textu obrázku obojího 13

Tlačítka mnoho druhů tlačítek (buttons) všechna dědí od AbstractButton normální tlačítko (JButton) "klikací" tlačítko toggle button (JToggleButton) přepínací tlačítko (dva stavy) check box (JCheckBox) zaškrtávácí tlačítko radio button (JRadioButton) typicky ve skupině, stisknuté jen jedno událost ActionEvent listener ActionListener 14

Skupiny tlačítek skupina tlačítek stisknuto jen jedno typicky pro RadioButton třída ButtonGroup JRadioButton buttons[] = new JRadioButton [4]; for (int i=0; i<4; i++) { pane.add(buttons[i] = new JRadioButton("Button "+(i+1))); } ButtonGroup bg = new ButtonGroup(); for (int i=0; i<4; i++) { bg.add(buttons[i]); } 15

Tlačítka a HTML text tlačítek a dalších komponent (label,...) může být zadán v HTML starší JDK nemusejí HTML podporovat vůbec nebo jen částečně new JButton("<html><b><u>T</u>wo<br>lines</b></html>") new JLabel("<html><font color=#ff0000>hello</font></html>") 16

Ikony interface Icon lze použít na label, tlačítko, menu,... třída ImageIcon implementuje Icon ikona vytvořená z obrázku ze souboru, URL,... jpg, png, gif new JButton("Click", new ImageIcon("ystar.png")); new JLabel("Hello", new ImageIcon("gstar.png"), SwingConstants.CENTER); 17

Tool tips "malá" nápověda "bublina" s textem objeví se při delším podržení myší nad komponentou lze nastavit všemu, co dědí od JComponent button.settooltiptext("click here"); 18

Textové pole třída JTextField editace jednoho řádku textu po stisknutí klávesy ENTER ActionEvent metody String gettext() vratí napsaný text void settext(string text) nastaví text třída JTextArea editace více řádků pro zobrazení posuvníků (scrollbars) nutno vložit do JScrollPane new JScrollPane(new JTextArea()) JScrollPane funguje na vše co implementuje Scrollable 19

Combo box třída JComboBox tlačítko s možnostmi na výběr lze i editovat seteditable(boolean b) při změně ActionEvent String[] list = { "aaaa", "bbbb",... }; JComboBox cb = new JComboBox(list); cb.seteditable(true); 20

List box třída JList seznam položek umožňuje vybírat položky jednu i více naráz (setselectionmode(int mode)) metody int getselectedindex() Object getselectedvalue() ListSelectionEvent ListSelectionListener 21

Menu frame.setjmenubar(createmenu());... private static JMenuBar createmenu() { JMenuBar mb = new JMenuBar(); JMenu menu = new JMenu("File"); JMenuItem item = new JMenuItem("Quit"); menu.add(item); mb.add(menu); menu = new JMenu("Help"); item = new JMenuItem("Content"); menu.add(item); menu.add(new JSeparator());... mb.add(menu); } return mb; 22

Stromy třída JTree výběr prvku ve stromu TreeSelectionEvent, TreeSelectionListener JTree tree = new JTree(); tree.addtreeselectionlistener(new TreeSelectionListener() { public void valuechanged(treeselectionevent e) { System.out.println(e.getPath()); } }); 23

Swing Layouts 24

Přehled vlastnost kontejneru komponenty GUI se umísťují do kontejnerů (frame, dialog, panel,...) určuje velikost a umístění komponent v kontejneru určuje změnu velikosti a umístění při změně velikosti kontejneru implementuje interface java.awt.layoutmanager java.awt.container void setlayout(layoutmanager m) LayoutManager getlayout() 25

BorderLayout implicitní layout pro content pane 5 regionů - north, south, east, west, center W E S T NORTH CENTER SOUTH E A S T JPanel p = new JPanel(); p.setlayout(new BorderLayout()); p.add(new Button("Okay"), BorderLayout.SOUTH); // nasledující řádky dělají totéž p.add(new Button("Cancel")); p.add(new Button("Cancel"), BorderLayout.CENTER); 26

BorderLayout relativní určování regionu page start, page end, line start, line end závisí na nastavení ComponentOrientation java.awt.component setcomponentorientation getcomponentorientation java.awt.componentorientation orientace komponent v závislosti na jazyku při ComponentOrientation.LEFT_TO_RIGHT se shoduje s north, south, west, east l s i t n a e r t page start CENTER page end l e i n n d e 27

BorderLayout implicitně žádné mezery mezi komponenty kontaineru konstruktor BorderLayout(int horizontalgap, int verticalgap) metody void setvgap(int) void sethgap(int) 28

FlowLayout implicitní layout pro JPanel davá komponenty do kontejneru za sebe do řady pokud už není místo, začne další řadu contentpane.setlayout(new FlowLayout()); contentpane.add(new JButton("Button 1")); contentpane.add(new JButton("Button 2")); contentpane.add(new JButton("Button 3")); contentpane.add(new JButton("Long-Named Button 4")); contentpane.add(new JButton("5")); 29

FlowLayout konstruktory FlowLayout() FlowLayout(int alignment) FlowLayout(int alignment, int horizontalgap, int verticalgap) alignment kam se budou komponenty zarovnávat FlowLayout.LEADING dopředu FlowLayout.CENTER na střed FlowLayout.TRAILING na konec opět záleží na ComponentOrientation Gap mezery mezi komponentami 30

GridLayout komponenty umísťuje do tabulky každá komponenta zabírá celou buňku tabulky všechny buňky mají stejnou velikost specifikuje se počet sloupců a řádků GridLayout(int rows, int columns) jeden z rozměrů může být 0 oba zároveň ne daný rozměr není specifikován určí se podle počtu vložených komponent pořadí opět podle ComponentOrientation pane.setlayout(new GridLayout(0,2)); pane.add(new JButton("Button 1")); pane.add(new JButton("Button 2"));... 31

CardLayout umožňuje, aby více komponent (typicky JPanel) sdílelo jedno místo v jednu chvíli zobrazena jen jedna komponenta JPanel cards; final static String PANEL1 = "Panel1"; final static String PANEL2 = "Panel2"; JPanel card1 = new JPanel();... JPanel card2 = new JPanel();... cards = new JPanel(new CardLayout()); cards.add(card1, PANEL1); cards.add(card2, PANEL2); 32

CardLayout přepínání zobrazení CardLayout cl = (CardLayout)(cards.getLayout()); cl.show(cards, PANEL2); další metody pro přepínaní zobrazení void first(container) void next(container) void previous(container) void last(container) TabbedPane podobné CardLayout není to layout je to samostatná komponenty sama zobrazuje záložky 33

GridBagLayout nejsložitější a zároveň nejflexibilnější layout umísťuje komponenty do tabulky jedna komponenta může být přes více řádků nebo sloupců sloupce a řádky nemusejí mít stejnou velikost umístění komponent se určuje pomocí GridBagConstraint JPanel pane = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); // pro každou komponentu //...vytvořit komponentu... //...nastavit constraint... pane.add(thecomponent, c); 34

GridBagConstraint: atributy gridx, gridy sloupec a řada levé horní části komponety sloupec nejvíc vlevo gridx = 0 řádek nahoře gridy = 0 hodnota GridBagConstraint.RELATIVE (implicitní) komponenta bude umístěna vpravo od předchozí (gridx) nebo pod předchozí (gridy) doporučení vždy specifikovat hodnoty pro každou komponentu 35

GridBagConstraint: atributy gridwidth, gridheight počet sloupců (gridwidth) a řádků (gridheight), které komponenta zabere implicitní hodnota 1 hodnota GridBagConstraint.REMAINDER komponenta bude poslední ve sloupci (gridwidth) nebo řádku (gridheight) hodnota GridBagConstraint.RELATIVE komponenta bude vedle předchozí 36

GridBagConstraint: atributy fill určuje změnu velikosti komponenty, pokud plocha pro zobrazení je větší než komponenta hodnoty (konstanty na GridBagConstraint) NONE (implicitní) velikost komponenty se nemění HORIZONTAL roztáhne komponentu na šířku výšku nemění VERTICAL roztáhne komponentu na výšku šířku nemění BOTH roztáhne komponentu na celou plochu pro zobrazení 37

GridBagConstraint: atributy ipadx, ipady vnitřní doplnění implicitně 0 kolik přidat k minimální velikosti komponenty šířka komponenty bude minimálně 2*ipadx doplnění je přidáno na obě strany obdobně výška komponenty bude minimálně 2*ipady insets vnější doplnění minimální místo mezi komponentou a hranicí plochy pro zobrazení implicitně žádné hodnota objekt java.awt.insets konstruktor Insets(nahore, vlevo, dole, vpravo) 38

GridBagConstraint: atributy anchor kam umístit komponentu, pokud je menší než velikost plochy pro zobrazení hodnoty konstanty na GridBagContraint ------------------------------------------------ FIRST_LINE_START PAGE_START FIRST_LINE_END LINE_START CENTER LINE_END LAST_LINE_START PAGE_END LAST_LINE_END ------------------------------------------------ 39

GridBagConstraint: atributy weightx, weighty hodnoty mezi 0.0 a 1.0 implicitně 0 určuje, jak se rozdělí prostor mezi řádky, resp. sloupci pokud všechny weight(x y) = 0 v řádku resp. sloupci, jsou komponenty soustředěny na střed kontaineru důležité hlavně při změně velikosti kontejneru 40

GridBagLayout: příklad Button1, Button2, Button3: weightx = 1.0 Button4: weightx = 1.0, gridwidth = GridBagConstraints.REMAINDER Button5: gridwidth = GridBagConstraints.REMAINDER Button6: gridwidth = GridBagConstraints.RELATIVE Button7: gridwidth = GridBagConstraints.REMAINDER Button8: gridheight = 2, weighty = 1.0 Button9, Button 10: gridwidth = GridBagConstraints.REMAINDER 41

GridBagLayout: příklad Všechna tlačítka: ipadx = 0, fill = GridBagConstraints.HORIZONTAL Button 1: ipady = 0, weightx = 0.5, weighty = 0.0, gridwidth = 1, anchor = GridBagConstraints.CENTER, insets = new Insets(0,0,0,0), gridx = 0, gridy = 0 Button 2: weightx = 0.5, gridx = 1, gridy = 0 Button 3: weightx = 0.5, gridx = 2, gridy = 0 Button 4: ipady = 40, weightx = 0.0, gridwidth = 3, gridx = 0, gridy = 1 Button 5: ipady = 0, weightx = 0.0, weighty = 1.0, anchor = GridBagConstraints.SOUTH, insets = new Insets(10,0,0,0), gridwidth = 2, gridx = 1, gridy = 2 42

SpringLayout přidán od JDK 1.4 velmi flexibilní dokáže emulovat většinu předchozích layoutů nízkoúrovňový určen pro IDE nástroje není určen pro přímé použití nicméně je to možné 43

Žádný layout umístění komponent na absolutní pozice pane.setlayout(null); JButton b1 = new JButton("one"); JButton b2 = new JButton("two"); JButton b3 = new JButton("three"); pane.add(b1); pane.add(b2); pane.add(b3); Insets insets = pane.getinsets(); Dimension size = b1.getpreferredsize(); b1.setbounds(25 + insets.left, 5 + insets.top, size.width, size.height); size = b2.getpreferredsize(); b2.setbounds(55 + insets.left, 40 + insets.top, size.width, size.height); size = b3.getpreferredsize(); b3.setbounds(150 + insets.left, 15 + insets.top, size.width + 50, size.height + 20); 44

Vlastní layout implementovat interface java.awt.layoutmanager metody void addlayoutcomponent(string, Component) volaná kontejnerem v metodě add přidává komponentu do layoutu asociuje komponentu se stringem void removelayoutcomponent(component) volaná kontejnerem v metodách remove a removeall Dimension preferredlayoutsize(container) idealní velikost kontejneru Dimension minimumlayoutsize(container) minimální velikost kontejneru void layoutcontainer(container) volá se při prvním zobrazení a při každé změně velikosti kontejneru 45

Swing Vlákna 46

Přehled obsluha událostí a vykreslování GUI jedno vlákno (event-dispatching thread) zajišťuje postupné obsluhování událostí každá událost se obslouží až po skončení předchozí obsluhy události nepřerušují vykreslování SwingUtilities.invokeLater(Runnable dorun) SwingUtilities.invokeAndWait(Runnable dorun) SwingUtilities.isEventDispatchingThread() test, zda aktuální vlákno je event-dispatching thread obsluha události nesmí trvat dlouho! pokud trvá dlouho do zvláštního vlákna 47

SwingWorker<T,V> třída pro obsluhu dlouhotrvajících událostí součást JDK až od verze 6 pro starší JDK nutno stáhnout abstraktní třída nutno naimplementovat metodu protected abstract T doinbackground() provede dlouhotrvající činnost metoda execute() spustí nové vlákno provede v něm metodu doinbackground() 48

SwingWorker<T,V> public void actionperformed(actionevent e) {... final SwingWorker<Object, Object> worker = new SwingWorker<Object, Object>(){ public Object doinbackground() {... return somevalue; } }; worker.execute();... } doinbackground() vrací hodnotu lze ji získat metodou get() pokud činnost neskončila, volání se zablokuje metoda done() volána po skončení doinbackground() provede se ve vláknu obsluhujícím GUI (!) 49

SwingWorker<T,V> typové parametry T typ návratové hodnota z workeru V typ pro předávání dat z workeru během výpočtu Intermediate results (průběžné výsledky) protected void publish(v... chunks) odesílá data volá se z doinbackground() protected void process(list<v> chunks) zpracovává předaná data určena k přeimplementovaní v potomku volá se ve vláknu obsluhujícím GUI (!) stav wokeru public SwingWorker.StateValue getstate() hodnoty PENDING, STARTED, DONE 50

SwingWorker<T,V> aktuální postup výpočtu int getprogress() void setprogress(int progress) nenastavuje se automaticky nutno ručně volat z doinbackground() ale není to nutné addpropertychangelistener(propertychangelistener listener) listener pro změnu stavu a postupu výpočtu zrušení background workeru metoda cancel() doinbackground() musí spolupracovat pomocí metody iscancel(); 51

Swing Timer třída javax.swing.timer Vykonání činnosti později, opakovaně časovač pro použití s GUI vhodné použít, pokud naplánovaná činnost obsluhuje GUI existuje přímo vyhrazené Timer vlákno, které kooperuje s event-dispatch vláknem "normální" Timer by se neměl používat pro obsluhu GUI vytvoření Timer(int delay, ActionListener listener) Action listener provede činnost ve vláknu obsluhujícím GUI (!) metody start(), stop() setrepeats(boolean b) implicitně true 52

Swing JTree 53

Přehled javax.swing.jtree zobrazení hierarchických dat JTree neobsahuje data přímo pouze data zobrazuje data obsahuje model (model-view concept) obecně všechny složitější komponenty mají model JTree, JTable, JList, JButton,... model určuje, jak jsou zobrazovaná data uchovávána a získávána jedna komponenta může mít více modelů př: JList ListModel spravuje obsah seznamu ListSelectionModel aktuální výběr v seznamu 54

JTree: statický obsah DefaultMutableTreeNode top = new DefaultMutableTreeNode("Root"); createnodes(top); tree = new JTree(top);... private void createnodes(defaultmutabletreenode top) { DefaultMutableTreeNode node = null; DefaultMutableTreeNode leaf = null; node = new DefaultMutableTreeNode("Node1"); top.add(node); leaf = new DefaultMutableTreeNode("Leaf1"); node.add(leaf); leaf = new DefaultMutableTreeNode("Leaf2"); node.add(leaf); node = new DefaultMutableTreeNode("Node2"); top.add(node); 55

JTree: dynamické změny rootnode = new DefaultMutableTreeNode("Root Node"); treemodel = new DefaultTreeModel(rootNode); treemodel.addtreemodellistener(new MyTreeModelListener()); tree = new JTree(treeModel); tree.seteditable(true); tree.getselectionmodel().setselectionmode (TreeSelectionModel.SINGLE_TREE_SELECTION);... class MyTreeModelListener implements TreeModelListener { public void treenodeschanged(treemodelevent e) { } public void treenodesinserted(treemodelevent e) { } public void treenodesremoved(treemodelevent e) { } public void treestructurechanged(treemodelevent e) { } } 56

JTree: dynamické změny public DefaultMutableTreeNode addobject(defaultmutabletreenode parent, Object child, boolean shouldbevisible) { DefaultMutableTreeNode childnode = new DefaultMutableTreeNode(child);... treemodel.insertnodeinto(childnode, parent, parent.getchildcount()); } if (shouldbevisible) { tree.scrollpathtovisible(new TreePath(childNode.getPath())); } return childnode; 57

JTree: vlastní model model-view Model popisuje data (např. DefaultTreeModel) View Definuje, jak se mají data zobrazit (JTree) implicitní model DefaultTreeModel pokud nevyhovuje vlastní model př. implicitně uzly ve stromu jsou DefaultMutableTreeNode a implementují TreeNode interface vlastní model může přidávat uzly zcela jiného typu model musí implementovat TreeModel interface 58

TreeModel void addtreemodellistener(treemodellistener l); Object getchild(object parent, int index); int getchildcount(object parent); int getindexofchild(object parent, Object child); Object getroot(); boolean isleaf(object node); void removetreemodellistener(treemodellistener l); void valueforpathchanged(treepath path, Object; newvalue); 59

Ikony ve stromu TreeCellRenderer interface setcellrenderer(treecellrenderer r) metoda na JTree class MyRenderer extends DefaultTreeCellRenderer { public Component gettreecellrenderercomponent(jtree tree,object value,boolean sel,boolean expanded, boolean leaf,int row,boolean hasfocus) { super.gettreecellrenderercomponent(tree, value, sel, expanded, leaf, row, hasfocus); if (...) { seticon(someicon); settooltiptext("..."); } else {...} return this; 60

Ikony ve stromu ImageIcon leaficon = createimageicon(".."); if (leaficon!= null) { DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); } renderer.setleaficon(leaficon); tree.setcellrenderer(renderer); 61

Swing Dialogy 62

Přehled JDialog dialog = okno podobně jako frame dialog je závislý na frame dialog je modální pokud je zobrazen, je zablokovaný vstup do ostatních oken programu lze vytvářet i nemodální dialogy práce s dialogem stejná jako u frame JOptionPane komponenta usnadňující vytváření standardních dialogů předpřipravené dialogy 63

JOptionPane 64

JOptionPane předpřipravené dialogy lze je konfigurovat defaultní volba statické metody vytvářející dialogy (vždy několik variant jedné metody) showmessagedialog() informační dialog showinputdialog() dialog vyžadující vstup od uživatele vrací String showconfirmdialog() dotazovací dialog (Ano/Ne/Zrušit) vrací int showoptiondialog() Výběr z více možností (Ano-Ne-Možná-Zrušit) 65

JOptionPane lze používat přímo vytvořit JOptionPane objekt několik konstruktorů vložit vytvořený objekt do dialogu 66

JFileChooser standardní dialog pro výběr souborů JFileChooser chooser = new JFileChooser(); chooser.setdialogtype(jfilechooser.open_dialog) FileNameExtensionFilter filter = new FileNameExtensionFilter( "Obrazky", "jpg", "gif"); chooser.setfilefilter(filter); int returnval = chooser.showopendialog(parent); if (returnval == JFileChooser.APPROVE_OPTION) { System.out.println("Vybraný soubor: " + chooser.getselectedfile().getname()); } 67

Java, zimní semestr Verze prezentace 2014 J10.cz.2014.01 Tato prezentace podléhá licenci Creative Commons Uveďte autora-neužívejte komerčně 4.0 Mezinárodní License. 68