Programování v jazyku Java GUI, události

Podobné dokumenty
GUI (Graphical User Interface)

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

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

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

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

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

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

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

Základní grafika. Princip zobrazování obsahu. Grafický kontext. Zobrazovací metody. Přednáška 3

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

JAVA JavaBeans Java, letní semestr

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

Úvod do programovacích jazyků (Java)

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

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

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.

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

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

Technologie JavaBeans

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

2 Tvorba interaktivních grafických programů

Generické programování

typová konverze typová inference

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

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

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.

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

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.

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

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

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

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

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

JAVA JavaBeans Java, letní semestr 2018

Teoretické minimum z PJV

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

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

RMI Remote Method Invocation

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

RMI - Distribuované objekty v Javě

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

Chain of responsibility

Abstraktní třída a rozhraní

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

7 Jazyk UML (Unified Modeling Language)

Principy objektově orientovaného programování

Seminář Java IV p.1/38

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

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

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

UJO Framework. revoluční architektura beans. verze

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

Jazyk C# (seminář 6)

7 Jazyk UML (Unified Modeling Language)

20. Projekt Domácí mediotéka

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

GUI. Systémová integrace pro desktopové aplikace

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

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

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

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

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

Java Výjimky Java, zimní semestr

Čipové karty Lekařská informatika

Základy objektové orientace I. Únor 2010

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

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

Algoritmizace a programování

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Abstraktní datové typy: zásobník

Java Enum Java, zimní semestr ,2017 1

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

Iterator & for cyklus

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/

Typický prvek kolekce pro české řazení

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Programování v Javě I. Leden 2008

KTE / ZPE Informační technologie

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

Objektově orientované programování v PHP 5. Martin Klíma

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

Návrh aplikace. Project Westpon. Inteligentní simulátor budov. Martin Mudra, Jan Smejkal, Onřej Macoszek, Marek Žehra, Jiří Slivárich

Java - řazení objektů

3. Třídy. Základní pojmy objektového programování. Třídy

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

Programování v C++ 1, 6. cvičení

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

Programátorská příručka

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

KIV/PIA 2013 Jan Tichava

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

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

1. Dědičnost a polymorfismus

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

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

Jakub Čermák Microsoft Student Partner

Jazyk C# (seminář 3)

Transkript:

Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Programování v jazyku Java GUI, události BI-PJV Programování v jazyku Java Katedra teoretické informatiky Miroslav Balík Fakulta informačních technologií České vysoké učení technické

Kreslení na plátno třída Graphics Tento objekt umožňuje v objektech typu Component a tedy i Canvas, Panel, Applet, Window, Frame atd. vytvořit a upravovat kresby, texty a obrázky. Přístup k němu se získá přepsáním zděděné prázdné metody např. takto: public void paint( Graphics g ) { g.drawxyz(... ); g.setcolor( c1 ); g.fillxyz(... ); g.setfont( f ); g.setcolor( c2 ); g.drawstring( s,... ); // kreslí obrys obrazce v barvě BLACK // nastaví pero na barvu c1 // kreslí plný obrazec // nastaví font písma // nastaví pero na barvu c2 // nakreslí text dle fontu barvy c2 g.drawimage( im,... ); // vykreslí obrázek {.gif,.jpg,.png Případně též metodou Graphics getgraphics( ), která vytvoří grafický kontext pro skrytý bufer ( off-screen image ). To využívá technika tzv. double bufferingu pro hladší animace. 2/35

Graphics Jednoduché obrazce a čáry a další metody: drawpolyline() clearrect( ) - přemalování na barvu pozadí dle setbackground( ) cliprect( ), getclip( ), setclip( ),... - vytřihovánky a nalepovánky copyarea( ) - kopírování plošky setfont( ), getfont( ) - práce s fonty getfontmetrics( ) - měření nápisů dispose( ) - uvolnění zdrojů 3/35

Modifikace kreseb Při objevení ( zpočátku, deiconifikaci, odkrytí ) volá awt vlákno metodu g.clearrect(...), která přebarví pozadí a pak metodu paint( Graphics g ). Při programovém volání metody repaint(... ), awt vlákno zavolá metodu update( Graphics g ), která defaultně obsahuje: public void update( Graphics g ) {... g.clearrect(... ); paint( g ); Metodu update je možné přepsat, např. tak, aby se nepřemalovávalo, čímž se kreslí na předchozí kresbu: public void update( Graphics g ) { paint( g ); public void paint( Graphics g ) {... Vnější změnou atributů užitých v kreslících metodách ( tj. g.draw( ) apod. ) a následném zavolání repaint(... ) se kresba změní či animuje. Přepočítání atributů či pospávání by mělo konat samostatné vlákno nikoli awt thread ( je dost zaměstnáno a sleduje chování uživatele ). 4/35

repaint( ), update( ), paint( ) int x = 333; computeit(... ) { x = 777 ; repaint(... ) // future call... user thread user thread idle application triggered default update( Graphics g ) { g.clearrect(... ) ; paint( update( g ); Graphics // optiong ) { g.draw...( x,... ) ; awt paint( g ); // option setvisible, unhide, enlarge setbackground, setforeground, setfont, setlayout, validate, add, remove awt thread idle swing awt thread system triggered partial clearrect( ) paint( Graphics g ) { g.draw...( x,... ) ;... 5/35

Vykreslení obrázku public class ImageLoad extends Frame { static Toolkit tk = Toolkit.getDefaultToolkit( ); static Image img = tk.getimage( "C:\\...\\star.gif" ); int width, height ; public ImageLoad( ) throws Exception { MediaTracker mt = new MediaTracker( this ); mt.addimage( img, 0 ); mt.waitforall( ); width = img.getwidth( this ); height = img.getheight( this ); this.setbounds( 100, 100, 200, 200); this.setvisible( true ); public void paint( Graphics g ) { g.drawimage( img, 100, 100, this ); 6/35

Font Tato třídy podporuje rozmanitá vykreslení textů. Font má konstruktor: public Font ( String name, int style, int size ) kde: name - courier, helvetica, dialog, inputdialog, sanserif, monospaced... style - tvar znaků zadaný konstantami PLAIN, BOLD, ITALIC size - bodová velikost např. 8.. 96 Příklad: public void paint( Graphics g ) { g.setfont( new Font( "courier", Font.ITALIC + Font.BOLD, 18 ) ); g.drawstring( "Hello, World", 75, 400 ); Fonty jsou uspořádány v rodinách. Zjistit dostupné fonty lze takto: GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment( ); Font[ ] ff = ge.getallfonts( ); 7/35

FontMetrics Zvláště proporcionální písmomalířství je obtížné. FontMetrics umožňuje písmo daného fontu měřit a zkusmo pak zvolit vhodný font. Metrika písma: K měření pro daný font slouží metody: getleading, getascent, getdescent, getheight, getmaxascent, getmaxdescent, getmaxadvance... a zejména pratické: int charwidth( char c ) vrací odstup znaku od dalšího v řádce. int stringwidth( String s ) vrací délku řetězu. FontMetrics fm = g.getfontmetrics( ); int w = fm.stringwidth( "áčďéěíňóřšťúůýžáčďéěíňóřšťúůýž" ); 8/35

Události ( s ) V rámci GUI je definován model událostí ( event model ) od Javy 1.1 tzv. delegační model. ( Původní tzv. hierarchický model se již neužívá. ) Událost je objekt popisující jev a poskytující metody k obsluze. Zdroj události ( např. komponenta ) je objekt, generující události ( i více typů ) - např. Button po stisku či Frame při pohybu myši - a rozesílá je registrovaným handlerům. Zdroj handlery registruje ve svých dynamických seznamech. Události posílá tak, že zavolá patřičnou metodu handleru s parametrem odkazujícím na událost. Handler je objekt ( vytvořený programátorem ), který událost přijme a zpracuje. Aby dokázal událost přijmout, musí implementovat jeden či více tzv. listenerů ( tj. posluchačů ) specifických typů. je specifický interfejs pro každý typ události. Tentýž objekt může být současně zdrojem i handlerem. 9/35

Registrace a rozesílání hx = handler for sx = XXX XXX source hxy = handler for XXX sy = YYY source XXX, YYY hy = handler for YYY YYY seznam handlerů registrace rozesílání ( broadcast ) implements 10/35

Zdroje a handlery class HX implements XXX {... /* konkrétní požadované metody */ class HY implements YYY {... class HXY implements XXX, YYY {...... /* konkrétní požadované metody */ HX hx = new HX( ); HY hy = new HY( ); HXY hxy = new HXY( ); /* konstrukce handlerů sx.addxxx( hx ); /* registrace handlerů h u zdrojů s */ sx.addxxx( hxy );... sy.addyyy( hxy ); sy.addyyy( hy ); 11/35

java.util java.awt.event Object Active InputMethod Hierarchy Invocation javax.swing.event Internal Ancestor java.awt AWT Component Action Adjustment Frame Item Text Input Container Window Focus Paint Mouse Key MenuKey *** *** *** all except Mouse Wheel MenuDrag Mouse java.awt AWT Multicaster AWT 12/35

y a adaptery java.util 0 InputMethod 1 MouseWheel 1 Action javax.swing Action 1 1 Adjustment Item Text 1 1 1 Hierarchy 1 Mouse Mouse Adapter MouseMotion Focus Key HierarchyBounds 5 2 2 3 2 MouseMotion Focus Key Adapter Adapter Adapter Hierarchy Bounds Adapter WindowState WindowFocus 1 2 Window Window Adapter Component Container AWT 7 4 2 1 10 Component Adapter Container Adapter AWT Proxy 13/35

Zdroje událostí * dědí Action ale negeneruje Action 14/35

Metody listenerů Action - Button, List, TextField, MenuItem, CheckboxMenuItem actionperformed ( Action e ) Adjustment - Scrollbar adjustmentvaluechanged ( Adjustment e ) AWT eventdispatched ( AWT e ) Component - všechny třídy ( mimo MenuItem a potomků ) componenthidden ( Component e ) componentmoved ( Component e ) componentresized ( Component e ) componentshown ( Component e ) Container - Container a potomci componentadded ( Container e ) componentremoved ( Container e ) Focus - všechny třídy ( mimo MenuItem a potomků ) focusgained ( Focus e ) focuslost ( Focus e ) 15/35

Metody listenerů HierarchyBounds ancestormoved ( Hierarchy e ) ancestorresized ( Hierarchy e ) Hierarchy hierarchychanged ( Hierarchy e ) InputMethod pro znaková písma caretpositionchanged ( InputMethod e ) inputmethodtextchanged ( InputMethod e ) Item Checkbox, CheckboxMenuItem, Choice, List itemstatechanged ( Item e ) Key - všechny třídy ( mimo MenuItem a potomků ) keypressed ( Key e ) keyreleased ( Key e ) keytyped ( Key e ) 16/35

Metody listenerů Mouse - všechny třídy ( mimo MenuItem a potomků ) mouseclicked ( Mouse e ) mouseentered ( Mouse e ) mouseexited ( Mouse e ) mousepressed ( Mouse e ) mousereleased ( Mouse e ) MouseMotion - všechny třídy ( mimo MenuItem a potomků ) mousedragged ( Mouse e ) mousemoved ( Mouse e ) Text TextComponent, TextArea a TextField textvaluechanged ( Text e ) 17/35

Metody listenerů WindowFocus windowgainedfocus ( Window e ) windowlostfocus ( Window e ) Window Window a potomci windowactivated ( Window e ) windowclosed ( Window e ) windowclosing ( Window e ) pro zavření windowdeactivated ( Window e ) windowdeiconified ( Window e ) windowiconified ( Window e ) windowopened ( Window e ) WindowState windowstatechanged ( Window e ) 18/35

Listening class MyFrame extends Frame implements Action, Item { // tato instance je handler Button b = new Button( OK ); Checkbox c = new Checkbox( ); public MyFrame( ) { add( b ); add( c ); b.addaction( this ); c.additem( this );... public void actionperformed( Action e ) {... public void itemstatechanged( Item e ) {... 19/35

Adaptery Adapter je abstraktní třída, která implementuje interfejs ( např. listener ), pouze konkrétními, prázdnými metodami. Potomek adapteru je již konkrétní třída mající potřebné metody přepsané na neprázdné. To je výhodné při implementaci těch listenerů, které definují více metod ač chceme využít jen některé z nich. K zavření okna ( Window, Dialog, Frame ) stačí metoda windowclosing( ), jež je jedna ze sedmi Windowu - ostatních šest by bylo nutno definovat alespoň jako prázdné. Adapter umožňuje přepsat jen tuto. Zavření okna nemusí znamenat ukončení aplikace. Tu je třeba případně ukončit např. pomocí System.exit(0) Zdroje lze uvolnit metodou dispose(). 20/35

Ukončení aplikace public class MyFrame extends Frame { public MyFrame( ) { this.addwindow( new WindowAdapter( ) { // Handler as anonymous inner class public void windowclosing( Window e ) { System.exit( 0 ); );...... objekt anonymní třídy 21/35

Ukončení aplikace public class MyFrame extends Frame { public MyFrame( ) {... this.addwindow( new Closer( ) ); // creation and registration...... class Closer extends WindowAdapter { public void windowclosing( Window e ) { System.exit( 0 ); // handler 22/35

public class Test extends Frame { public Point p; public Test( ) { this.addmousemotion( ); // registration new Test_this_mouseMotionAdapter( this ) // create handler void this_mousemoved( Mouse e ) { p = e.getpoint( ); class Test_this_mouseMotionAdapter extends MouseMotionAdapter { Test adaptee; Test_this_mouseMotionAdapter( Test adaptee ) { this.adaptee = adaptee; public void mousemoved( Mouse e ) { adaptee.this_mousemoved( e ); Poloha myši // overriding method // event receipt 23/35

Vytvoření anonymních tříd java.lang Object java.util java.lang Object XXX XXX anonymous Adapter anonymous pomocí adapteru: new XXXAdapter( ) {... pomocí listeneru: new XXX( ) {... 24/35

Focus Fokus čili ohnisko určuje komponentu, ke které mají směřovat akce a zprávy ze zdroje, který to sám neurčuje tj. např. z klávesnice. Focus i FocusAdapter obsahují dvě metody: focusgained( Focus e ) a focuslost( Focus e ) umožňující komponentě zjistit zda je v ohnisku. Třída Component definuje metody: public boolean isfocusowner( ) public void setfocusable( boolean focusable ) protected void processfocus( Focus e ) 25/35

Architektura MVC = Model-View-Controller + registrace state query get http://java.sun.com/blueprints/patterns Model Zapouzdřuje stav Vyjevuje funkcionalitu Odpovídá na dotazy o stavu Notifikuje View o změně state change set get state change View Vykresluje model Požaduje aktuální data od modelu Akceptuje gesta uživatele Notifikuje listenery Dovoluje vybrat pohled + registrace view selection set user gesture Controller Zapouzdřuje chování aplikace Převádí akce do modelu Vybírá pohled method call event notification reference 26/35

MVC = Model-View-Control Server Model state state state state state state query change change query change change View View user view user view gesture selection gesture selection Control Control Client1 Client2 call method event notify 27/35

Počáteční interakce Application new Model( ); Model new View( m ); View new Control( m, v ); register: add for state change Control register: add for user gesture 28/35

Interakce Model View Control action1 user gesture process set state change get state change state query process refresh action2 user gesture process show view selection 29/35

Využití MVC pro vlastní komponenty Swingové komponenty zařídí automaticky pohled a řízení, my vhodně implementujeme model. Nejjednodušeji implementací příslušného abstraktního modelu, nebo zastíněním vhodného předka. Příklad pro Spinner pro cyklicky organizované pracovní dny: (zde si ukážeme použití vlastní reprezentace dat, přestože by bylo vhodnější využít zděděný list) PracovniTyden prt = new PracovniTyden(); JSpinner jsp = new JSpinner(prT); getcontentpane().add(jsp); - registrace modelu u komponenty 30/35

Spinner pro pracovní dny class PracovniTyden extends SpinnerListModel{ List<String> prdny; int index; // předek má list a index a měli bychom je použít public PracovniTyden() { prdny = Arrays.asList( new String[] {"pondělí","úterý","středa","čtvrtek","pátek"); Neaktualizujeme index!! To provede setvalue(..) public List<?> getlist() { return prdny; public Object getnextvalue() { return (index >= (prdny.size() - 1))? prdny.get(0) : prdny.get(index + 1); public Object getpreviousvalue() { return (index <= 0)? prdny.get(prdny.size() - 1) : prdny.get(index - 1); 31/35

Spinner pro pracovní dny public Object getvalue() { return prdny.get(index); public void setvalue(object elt) { int pomindex = prdny.indexof(elt); if (pomindex == -1) { throw new IllegalArgumentException("invalid sequence element"); else if (pomindex!= this.index) { this.index = pomindex; firestatechanged(); 32/35

Fire & listen Třída Component má 3 ( 9 ve verzi 1.5 i pro všechny primitivní typy ) přetížené metody pro vyslání informace o změně nějakého atributu: protected void firepropertychange ( String propertyname, int oldvalue, int newvalue ) ( String propertyname, boolean oldvalue, boolean newvalue ) ( String propertyname, Object oldvalue, Object newvalue ) Pro připojení a odpojení posluchače má metody: public void addpropertychange( String propertyname, java.beans.propertychange pcl ) public void removepropertychange( String propertyname, java.beans.propertychange pcl ) Balíček java.beans definuje interface PropertyChange obsahující jen metodu: public void propertychange( java.beans.propertychange evt ) kde parametrem evt lze přistoupit k oldvalue i newvalue. 33/35

Interfejs Action je extenze interfejsu java.awt.event.action. void actionperformed( Action ev ) - zděděná metoda void addpropertychange( PropertyChange pcl ) void removepropertychange( PropertyChange pcl ) Object getvalue( String key ) void putvalue( String key, Object value ) boolean isenabled( ) setenabled( boolean b ) 34/35

AbstractAction implementuje interfejs Action kromě metody abstract actionperformed je vhodným předkem pro tvorbu konkrétních handlerů. Přidává metody: PropertyChange[ ] get PropertyChanges( ) void firepropertychange(string ptyname, Object oldval, Object newval) Object[ ] getkeys( ) Akci lze spouštět i z několika komponent, mohou ukázat tentýž text a ikonu definovanou v handleru. Příkladmo: Action a = new Act1(); JButton b = new JButton(a); JMenuItem m = new JMenuItem(a); JTextField t = new JTextField(...); t.setaction(a); class Act1 extends AbstractAction { public Act1(... ) { super( label, icon );... // no label and icon public void actionperformed( Action ev ) {... 35/35