|
||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
Java (30) - Look and FeelNe vždy se tvůrci nebo uživateli grafické aplikace v Javě zamlouvá výchozí
vzhled GUI. Není ovšem problém vybrat si vzhled jiný, nebo si dokonce vytvořit
svůj vlastní.
Princip ovládání vzhleduPůvodní grafické rozhraní javovských aplikací, tedy AWT, využívalo k vykreslování nativní grafické objekty. Možnosti měnit jejich vzhled byly tedy jednak dost omezené, ale hlavně silně platformově závislé. S grafickým frameworkem Swing nastala podstatná změna. Vzhled komponent GUI je zcela samostatný, není svázán s jednotlivými objekty a není determinován platformou, na které aplikace běží (až na malé výjimky, které později zmíním). Lze si to představit tak, že instance grafického objektu obsahuje všechny potřebné parametry k vykreslení dané komponenty, ale místo aby sama kreslila, deleguje tuto činnost na objekt nějakého grafického motivu. A tento "delegát" použije zase své parametry pro kreslení a složením dohromady vznikne výsledný vzhled.
Mohu uvést příklad. Máme instanci třídy Výchozí vzhled, změna vzhledu uživatelemPokud neurčíme jinak, bude spuštěná swingovská aplikace používat výchozí vzhled, tedy ten, který určili vývojáři Swingu. Většinou to bude vzhled označený jako Metal, který má v Javě 5.0 o něco lepším základní téma Ocean, kdežto to původní se nyní jmenuje Steel. Tento výchozí vzhled je k dispozici všude, kde jsou třídy frameworku Swing, na všech platformách. Kromě základního vzhledového motivu existují ještě další. Nabídka se liší podle platforem. Na GNU/Linuxu je k dispozici vzhled GTK a CDE/Motif, na Windows pak vzhled Windows a podobně. Není problém přiinstalovat si další a používat je pro všechny nebo jen pro některé aplikace. Výchozí vzhled může uživatel změnit dvěma způsoby (nepočítáme-li možnost, že vývojář programu poskytne možnost volby v přímo rámci své aplikace, jako to umožňuje třeba jEdit). První možností je určení v příkazové řádce, druhou pak nastavení v preferencích. Uvažujme např. následující příkazy: java Editor java -Dswing.metalTheme=steel Editor java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel Editor java -Dswing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel Editor
První příkaz spustí program swing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel Bohužel to nejde nastavit pro uživatele, jen pro celý systém. Snad se to v pozdějších verzích zlepší. Změna vzhledu v programu
Někdy je vhodné měnit vzhled GUI uvnitř běžícího programu - ať už chceme
poskytnout uživateli možnost snadného nastavení nebo mu prostě vnutit nějaký
konkrétní vzhled. O správu vzhledů se ve Swingu stará statická třída
Základem je dvojice metod try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { // reakce na výjimku } catch (IllegalAccessException ex) { // reakce na výjimku } catch (InstantiationException ex) { // reakce na výjimku } catch (UnsupportedLookAndFeelException ex) { // reakce na výjimku }
Všimněte si, že je potřeba pochytat řadu výjimek (lze to samozřejmě udělat
souhrnně, v příkladu jsou rozepsány jen kvůli názornosti). To vyplývá z toho, že
se třída získává pomocí metod reflexe (vzpomeňte na
Dále jsou tu metody
Ještě bych připomněl dvě metody, a sice Jak to všechno funguje
Objekty grafických komponent, jak známo, kreslí v metodě
Každá komponenta má totiž svého delegáta (potomka třídy
Zcela logicky nyní vyvstává otázka, odkud se berou ony objekty delegátů, které
se starají o kreslení jednotlivých komponent. Poskytuje je
Ještě by se někdo mohl ptát, kde delegáty vezme Multiplexovaný vzhled
Za normálních okolností má každá grafická komponenta právě jednoho delegáta.
Někdy je ale potřeba, aby jich bylo víc - například kromě klasického zobrazení
též zvukový výstup. K tomu slouží Multiplexing Look & Feel, zastupovaný
třídou
Vnitřní fungování je velice jednoduché. Každý delegát tohoto vzhledu obsahuje
kolekci jiných delegátů a jejich metody (např.
Nyní se vrátíme k odloženým metodám swing.auxiliarylaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel, mypackage.MySpecialLookAndFeel Aktualizace GUI po změně vzhledu
Změníme-li za běhu programu vzhled GUI, změna se neprojeví ihned. Projeví se
pouze u nově vytvářených komponent, ne však u těch již existujících. Aby se
komponenty překreslily s novým vzhledem, musí se každé z nich zavolat již
zmíněná metoda
Naštěstí se to nemusí provádět ručně pro každou
komponentu zvlášť, protože máme statickou metodu
Vytvoření vlastního vzhleduKdo si chce vytvořit vlastní vzhled, má v zásadě dvě možnosti - buď implementovat celý balík tříd, obsahující popis vzhledu a všechny potřebné delegáty, anebo se vydat cestou mnohem méně pracnou - použít vzhled Synth. Synth je plně implementovaný vzhled obsažený v Javě od verze 5.0, umožňující kromě jiného snadno uživatelsky definovat, jak bude GUI vypadat. Vzhled Synth lze používat buď na základě uživatelských souborů s popisem vzhledu nebo se vzhledovými objekty definovanými v programu. První možnost je důležitější, nicméně si připomeneme i tu druhou. Definice vzhledu pomocí XML souboruNež se pustíme do vytváření souboru s popisem vzhledu, je nezbytné sáhnout do programu a připravit ho pro takovýto způsob práce. Můžeme si napsat třeba takovouto metodu: public static void prepareGui() { try { SynthLookAndFeel slf = new SynthLookAndFeel(); InputStream is = App.class.getResourceAsStream("skin.xml"); if (is == null) throw new IOException("Nelze otevřít XML soubor."); try { slf.load(is, App.class); UIManager.setLookAndFeel(slf); } finally { is.close(); // musí se zavřít vždycky } } catch (Exception e) { String msg = "Nelze použít Synth:" + System.getProperty("line.separator") + e.getMessage(); JOptionPane.showMessageDialog(null, msg, "Chyba", JOptionPane.ERROR_MESSAGE); } }
Metoda vytvoří instanci vzhledu, otevře stream pro čtení z XML souboru se vzhledem
(skinem), zpracuje soubor a nastaví nový vzhled v
Načítání souboru jako prostředku se používá
dost často (ještě se k tomu někdy později vrátíme), protože programátor
nemusí řešit, jakým způsobem se aplikace spouští - zda jsou soubory jen tak
na disku, načítají se ze sítě nebo jsou v JAR archivu. Co se týká zmíněných
výjimek, tak pro výjimky vzniklé při parsování XML souboru je zvláštní blok
Nyní už můžeme přejít k vlastnímu XML souboru, zde tedy <?xml version="1.0" encoding="iso-8859-1"?> <synth> <style id="button"> <opaque value="TRUE"/> <font name="Times New Roman" size="16"/> <state> <color value="green" type="FOREGROUND"/> <color value="#0000ff" type="BACKGROUND"/> </state> <state value="PRESSED"> <color value="#ffff00" type="BACKGROUND"/> </state> </style> <bind style="button" type="region" key="Button"/> </synth>
Nebudu zde popisovat přesný formát, ten si každý může
prostudovat. Řeknu tedy
jen ve stručnosti, co výše uvedený text dělá. Bude se nastavovat styl tlačítek,
proto si ho nazveme Definice vzhledu v programu
I když bychom mohli i v programu vygenerovat XML data s popisem skinu, je to
zbytečně složité a také výpočetně náročné. Místo toho lze použít jednodušší
cestu, a to tvořicí třídu odvozenou od
Třídy odvozené od
Obecně ale není moc dobrý nápad to řešit takto, prakticky vždy si vystačíme
s XML souborem, případně doplněným pomocnými třídami - například potomky
Jak se tiskne?V příští kapitole budu opět na základě čtenářských dotazů měnit plán. Původně jsem zamýšlel začít příště se základy technologie JavaBeans, ovšem nakonec bude všechno jinak. Ukazuje se, jak obrovský zájem je o problematiku tisku v Javě. A protože tisk hodně úzce souvisí s "běžnou" grafikou (používají se stejné mechanismy), je vhodná chvíle právě teď. Takže příští kapitola bude věnována právě oblasti tisku z javovských programů.
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |