Swing Vlákna Java, zimní semestr

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

JAVA V GUI Java, zimní semestr

JAVA V GUI Java, zimní semestr

Kapitola 1. Stromy 1.1. Základní informace

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

GUI. Systémová integrace pro desktopové aplikace

GUI. Systémová integrace pro desktopové aplikace

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.

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

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

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

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

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

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

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.

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

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

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

20. Projekt Domácí mediotéka

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

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

JAVA JavaBeans Java, letní semestr

Generické programování

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

UJO Framework. revoluční architektura beans. verze

Distribuované systémy a výpočty

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

RMI Remote Method Invocation

Úvod do programovacích jazyků (Java)

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

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

Programátorská příručka

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

JAVA V RMI Java, letní semestr

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

Teoretické minimum z PJV

Jazyk C# (seminář 6)

Abstraktní datové typy: zásobník

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

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

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

JAVA JavaBeans Java, letní semestr 2018

typová konverze typová inference

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

Algoritmizace a programování

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

NSWI096 - INTERNET JavaScript

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

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

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

Technologie JavaBeans

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

OSGi. Aplikační programování v Javě (BI-APJ) - 6 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Seminář Java IV p.1/38

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

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

KTE / ZPE Informační technologie

IMPLEMENTACE INFORMAČNÍHO SYSTÉMU VIDIUM V JAZYCE JAVA

Principy objektově orientovaného programování

Java Výjimky Java, zimní semestr

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

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

Jazyk C# (seminář 3)

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

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

Programování v Javě I. Leden 2008

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

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Vývoj desktopových aplikací v Jazyce Java s bohatým grafickým uživatelským rozhraním.

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

Testovací metoda. Testovací metoda. public class SimpleTest {

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

Remote Method Invocation RMI

Soketové připojení Klient InetAddress getbyname() UnknowHostException SecurityException Socket getinputstream() getoutputstream() IOException Server

Swing Vlákna Java, zimní semestr

Začínáme s vývojem pro Android

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

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

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

Michal Podzimek

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

JAVA. Java Management Extensions JMX

JAVA RMI Java, letní semestr 2018

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

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

17. Projekt Trojúhelníky

Iterator & for cyklus

Úvod do programovacích jazyků (Java)

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

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

Java Enum Java, zimní semestr ,2017 1

KIV/PIA 2013 Jan Tichava

Typický prvek kolekce pro české řazení

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

1. Programování proti rozhraní

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

Více o konstruktorech a destruktorech

Transkript:

Swing Vlákna 1

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 2

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 http://java.sun.com/products/jfc/tsc/art icles/threads/src/swingworker.java je trochu jiná než ta přímo v JDK! 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() 3

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 (!) 4

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 5

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(); 6

Swing Timer třída javax.swing.timer Vykonání činnosti později, opakovaně časovač pro použítí 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 7

Swing JTree 8

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 9

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); 10

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) { } } 11

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; 12

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 13

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); 14

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; 15

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

Swing Dialogy 17

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 18

JOptionPane 19

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) 20

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

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()); } 22

JAVA Applet 23

Přehled applet = "malý" program běžící v prohlížeči bezpečnostní omezení definuje prohlížeč v podstatě žádný přístup k počítači omezený přístup na disk omezený přístup na síť... "podepisování" appletů "delší" spouštění kód se stahuje po síti browser může mít ve vyrovnávací paměti ale nemusí 24

Implementace rozšíření třídy javax.swing.japplet applety pomocí Swing komponent potomek java.applet.applet AWT komponenty metody init() voláno jednou při inicializaci Např. Vytvoření GUI POZOR nutné použít SwingUtilities.invokeAndWait(Runnable r) start() voláno při každé zviditelnění appletu stop() voláno při každém zneviditelnění appletu destroy() voláno při ukončování appletu 25

Implementace applet je kontejner hierarchie tříd java.lang.object java.awt.component java.awt.conteiner java.awt.panel java.awt.applet javax.swing.japplet vytváření GUI jako v "normální" aplikaci 26

Spouštění prohlížeč zobrazí applet na stránce aktuálně již nedoporučovaný způsob <applet code="example1.class" codebase= example archive="example.jar, Utilities.jar" width="100" height="80"> <param name="maxwidth" value="120"> <param name="nimgs" value="17"> <param name="offset" value="-57"> <param name="img" value="images/tumble"> Your browser is completely ignoring the <APPLET> tag! </applet> appletviewer součást JDK zobrazí jen applet bez stránky okolo 27

Příklad public class Applet1 extends JApplet { private void creategui() { getcontentpane().add(new JLabel("Applet!")); } } public void init() { try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { creategui(); } }); } catch (Exception e) { System.exit(0); } } 28

JAVA JNLP Java Web Start 29

Přehled Java Network Launch Protocol (JNLP) kombinace výhod appletu a normální aplikace aplikace se stáhne po sítí normální aplikace není to applet uloží se na disk a spustí v sandboxu při dalším spuštění se zkontroluje verze pokud je stejná, spustí se program z disku pokud se změnila, program se stáhne znovu podobná bezpečnostní omezení, jako applety aplikace lze podepisovat i nepodepsaná aplikace může mít přístup k počítači přes JNLP API rozdíl od appletů JNLP je jen specifikace implementace Java Web Start 30

Vytvoření JNLP aplikace normální aplikace zabalená v JAR souboru vytvoří se k ní spouštěcí soubor xml, přípona jnlp Web server mime.conf application/x-java-jnlp-file JNLP <?xml version="1.0" encoding="utf-8"?> <jnlp codebase="http://somewhere/" href="hello.jnlp"> <information> <title>example</title> <vendor>vendor</vendor> <description>description</description> <icon href="icon.png"/> <offline-allowed/> </information> <resources> <j2se version="1.4+"/> <jar href="hello.jar"/> </resources> <application-desc main-class="mainclass" /> </jnlp> 31

JNLP API pro JDK <= 1.4 musí se stáhnout samostatně API definuje služby (services) pro přístup ke zdrojům systému soubory, síť, clipboard,... zobrazí se okno s dotazem, zda povolit přístup ke zdroji přístup ke zdrojům přímo nefunguje způsobí výjimka služby se "natahují" pomocí javax.jnlp.servicemanager.lookup(string s) Lze povolit přístup ke všem zdrojům podepsaných JARů pomocí JNLP souboru: <security> <all-permissions/> </security> 32

FileOpenService FileOpenService fs = (FileOpenService) ServiceManager.lookup("javax.jnlp.FileOpenService"); FileContents filecontents = fs.openfiledialog(".", new String[]{"txt", "*"}); if (filecontents!= null) { String fname = filecontents.getname(); InputStream is = filecontents.getinputstream(); }... 33

FileSaveService FileSaveService fs = (FileSaveService) ServiceManager.lookup("javax.jnlp.FileSaveService"); FileContents filecontents = fs.savefiledialog(".", new String[]{"txt"}, new ByteArrayInputStream("data".getBytes()), "soubor.txt"); if (filecontents!= null) { } filecontents.getname();... 34

FileContents metody boolean canread() boolean canwrite() long getlength() String getname() InputStream getinputstream() OutputStream getoutputstream() JNLPRandomAccessFile getrandomaccessfile(string mode) 35

JNLP & Applety pomocí JNLP lze spouštět i applety v současnosti preferovaný způsob ale je nutno mít JDK 6 a vyšší <?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0+" codebase="" href=""> <information> <title>dynamic Tree Demo</title> <vendor>dynamic Team</vendor> </information> <resources> <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se" /> <jar href="dynamictreedemo.jar" main="true" /> </resources> <applet-desc name="dynamic Tree Demo Applet" main-class="components.dynamictreeapplet" width="300" height="300"> </applet-desc> <update check="background"/> </jnlp> JNLP soubor HTML stránka <script src="http://www.java.com/js/deployjava.js"></script> <script> var attributes = { code:'components.dynamictreeapplet', width:300, height:300} ; var parameters = {jnlp_href: 'dynamictree-applet.jnlp'} ; deployjava.runapplet(attributes, parameters, '1.6'); </script> 36