Kapitola 1. Přednáška 12 - Událostmi řízené programování. Grafické uživatelské rozhraní - úvod. Obsah Událostmi řízené programování v Jávě .......................................................... Komponenty GUI v Jávě .................................................................... Událostmi řízené programování ........................................................... Řízení událostmi ............................................................................... Kde to všechno je? ............................................................................ Typy událostí vznikajících v GUI......................................................... Přidání posluchače uálosti................................................................... Příklad - událost zavření okna.............................................................. Totéž bez anonymity.......................................................................... Příklad ............................................................................................ Další odkazy .................................................................................... Událostmi řízené programování v Jávě • Komponenty GUI v Jávě • Řízení událostmi a asynchronní programování • Typy událostí • Posluchači událostí, anonymní vnitřní třídy Komponenty GUI v Jávě V Jávě lze psát přenositelné aplikace s "okenním" rozhraním - s GUI • při jejich vývoji se s výhodou uplatní prostředí IDE - „builder", např. JBuilder, Sun Studio ONE, NetBeans... V tomto kurzu budeme pracovat s moderním Swing GUI, což je součást JFC (Java Foundation Classes). Starší variantou - dosud živou v Jávě verzí 1.1.x, je grafické rozhraní nad komponentami AWT (Abstract Windowing Toolkit). 1 1 1 2 2 2 2 3 3 3 4 4 Přednáška 12 - Událostmi řízené programování. Grafické uživatelské rozhraní - úvod. Událostmi řízené programování Základním principem tvorby aplikací s GUI je řízení programu událostmi. Netýká se však pouze GUI, je to obecnější pojem označující typ asynchronního programování, kdy je: • tok programu řízen událostmi; • události nastávají obvykle určitou uživatelskou akcí - klik či pohyb myši, stisk tlačítka...; • událostmi řízené aplikace musí být většinou programovány jako vícevláknové (i když spouštění vláken obvykle explicitně programovat nemusíme). Řízení událostmi Postup (životní cyklus události): 1. Událost vznikne (typicky uživatelskou akcí nad komponentou GUI). 2. Na komponentu musí být "zavěšen" posluchač dané události (event listener). 3. Systém vyvolá příslušnou metodu posluchače - my tu metodu obvykle smysluplně implementujeme tak, aby realizovala potřebnou akci. Viz též příklad -První GUI aplikace [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/swing/Swingl.java] Kde to všechno je? Technicky jsou dotyčné třídy a rozhraní komponent definovány obvykle v balících: j ava. awt - základní komponenty GUI AWT j ava . awt. event - události GUI AWT a v ostatních balících j a va. awt. * javax.swing- základní komponenty GUI Swing - rozšíření AWT • j avax. swing. event - události GUI Swing a v mnoha ostatních balících j avax .swing. * Typy událostí vznikajících v GUI 2 Přednáška 12 - Událostmi řízené programování. Grafické uživatelské rozhraní - úvod. Události mohou souviset s uživatelskou akcí nad/s: oknem -WindowEvent klávesnicí - KeyEvent myší (klikání a pohyb) - Mous eEvent získáním nebo ztrátou fokusu - FocusEvent (obecnou) akcí nad GUI (stisk tlačítka v GUI) - ActionEvent Přidání posluchače uálosti Aby událost mohla být ošetřena, tj. mohlo se na ni někde reagovat, je třeba k dané komponentně přidat objekt posluchače událostí. Velmi často - a skoro nikde jinde - se jako objekt posluchače používá objektu anonymní vnitřní třídy: • Třída je (jakoby „on-the-fly") definována a ihned -jen jedenkrát! - použita. • Ve skutečnosti samozřejmě se daná třída (její bajtkód) vytvoří a přeloží s ostatními hned ve fázi překladu mateřské třídy. V případě posluchačů události obvykle vnitřní třída má jen jednu metodu. Příklad - událost zavření okna Proč vůbec pomocí vnitřní třídy? výhody vnitřní třída má přístup k (i chráněným) prvkům mateřské třídy! nevýhody poněkud nepřehledné, třída je skryta v ostatním kódu navíc: pokud si speciálně nepamatujeme odkaz najednou vytvořený a zapojený posluchač, pak jej nelze z paměti odstranit - nemáme na něj odkaz V následujícím úryvku kódu se: okno.addWindowListener( new WindowListener() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); ...vytvoří jedna instance anonymní vnitřní třídy a ta se předá/použije jako posluchač událostí. Totéž bez anonymity... 3 Přednáška 12 - Událostmi řízené programování. Grafické uživatelské rozhraní - úvod. class MyWindowListener implements WindowListener { public void windowClosing(WindowEvent e) { System.exit(0); } } ... okno.addWindowListener(new MyWindowListener()); Příklad Mírně rozsáhlejší demo na GUI [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/svet/chovatelstvi/psi/ChovatelPsuGUI.java] Další odkazy Tvorba Swing-GUI aplikací - Trail: Creating a GUI with JFC/Swing [http://java.sun.com/docs/books/tutorial/uiswing/index.html] Tvorba appletů - Trail: Writing Applets [http://java.sun.coin/docs^oks/mtorial/applet/index.html] Vytváření aplikací přístupných i uživatelům s omezeními: • potíže se zrakem • problémy s ovládáním myši...viz JFC-Accessibility [http://java.sun.com/products/jfc/accessibility.html] Vynikající článek o GUI v Jávě: Ray Toal: Developing Complex User Interface Applications in Java [http://technocage.com/~ray/talks/swing.html] 4