ARCHIV |
|||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
Java (28) - renderery a editoryPři tvorbě GUI si většinou vystačíme s tím, co nám poskytují existující
grafické komponenty. Někdy je ale lepší chování komponent nějak změnit
- a jejich modulární stavba to velice dobře umožňuje. Pojďme se podívat na to,
jak upravit způsob vykreslování a editace dat. Vykreslovače čili rendererySložitější grafické komponty ve Swingu jsou hierarchicky složeny z komponent menších, jednodušších. Například minule popisované tabulky mají vnitřní strukturu poměrně komplikovanou, skládají se z řady různých grafických objektů. Patří mezi ně i objekty, které slouží k vykreslování dat obsažených v tabulce (resp. jiné komponentě, pokud bychom to brali obecně). Říká se jim renderery a používají se proto, že mít samostatnou komponentu pro každou hodnotu by bylo pomalé a paměťově náročné. A protože mají renderery jednoduché a snadno implementovatelné rozhraní, není vůbec problém nahrazovat je jinými implementacemi. Na začátku myšlenky vytvoření vlastního rendereru je nějaký požadavek, který nelze stávajícími prostředky realizovat. Můžeme například potřebovat, aby se záporná čísla v tabulce (třeba jen v některých buňkách) zobrazovala červeně. Lze se vydat dvěma cestami - buď si třídu napsat kompletně celou, nebo využít nějakou hotovou implementaci (nejčastěji tu výchozí) a jen změnit potřebné věci. První cesta se používá pro změny zásadního charakteru, často bude vhodnější ta druhá.
Podívejme se nyní, jak by vypadal onen zmíněný případ, že bychom chtěli
zobrazovat záporná čísla červeně. Upravená implementace rendereru bude
vycházet z té výchozí ( class MyRenderer extends DefaultTableCellRenderer { public MyRenderer() { super(); setHorizontalAlignment(RIGHT); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); c.setForeground(null); if (Number.class.isAssignableFrom(value.getClass())) { if (((Number) value).doubleValue() < 0.0) { c.setForeground(Color.RED); } } return c; } }
Nejprve je nutné si říci, jak se vlastně renderer zvenku používá. Z tabulky
se zavolá metoda
Při implementaci začneme konstruktorem. Ten zavolá konstruktor předka a pak
nastaví zarovnávání textu (vpravo). To je důležité, jinak by se zarovnávalo výchozím
způsobem, tedy nalevo. Všimněte si, že pokud tabulce nenastavíte žádný renderer,
budou se číselné hodnoty zarovávat automaticky vpravo.
Nyní už se pustíme do hlavní metody -
Velice důležité je správné naložení s nastavením barvy. Pokud bychom totiž
pouze nastavili barvu popředí (červenou) v těch případech, kdy to potřebujeme,
dočkali bychom se nepříjemného efektu. Červená barva by se použila i u
dalších buněk (pokud by nebyly vybrány). Proto je potřeba barvu resetovat -
můžeme klidně použít Tak to by byla implementace, a teď to ještě musíme použít v tabulce. Třeba takto: MyRenderer mr = new MyRenderer(); JTable table = new JTable(); table.setDefaultRenderer(Number.class, mr);
Vytvoří se instance rendereru a ta se přiřadí tabulce k použití pro hodnoty
třídy Změna barvy je jen jednou z mnoha věcí, které můžeme v rámci vlastní implementace rendereru provádět. Mezi další časté patří změna písma, zvláštní formátování, speciální chování pro některé třídy atd. Chcete-li s tím experimentovat, inspirujte se třeba v nějakém tabulkovém procesoru nebo jiném programu a zkuste stejnou věc realizovat zde. Není to složité. Zde je další příklad: class LsRenderer extends DefaultTreeCellRenderer { public LsRenderer() { super(); try { URL url = new URL("http://www.linuxsoft.cz/img/sipka1.png"); ImageIcon ic = new ImageIcon(url); setLeafIcon(ic); } catch (MalformedURLException e) { JOptionPane.showMessageDialog(this, "Chyba v URL ikony: " + e.getLocalizedMessage(), "Chyba", JOptionPane.ERROR_MESSAGE); } } } Jistě každý poznal, že tento renderer načte ze serveru Linuxsoftu obrázek a použije ho jako ikonu - v tomto případě ikonu listu ve stromě. Vlastní renderery pro stromy se totiž vytvářejí v podstatě stejně jako u tabulek. Totéž platí i pro seznamy. EditoryKromě vlastního přístupu k vykreslování někdy potřebujeme něco podobného uplatnit i pro editaci. Ať už se to týká třeba validace hodnoty nebo způsobu samotné editace. Plané řeči nemají smysl, pojďme rovnou na příklad: class MyEditor extends DefaultCellEditor { private double minVal = Double.NEGATIVE_INFINITY; private double maxVal = Double.POSITIVE_INFINITY; MyEditor() { super(new JTextField()); } MyEditor(double min, double max) { this(); minVal = min; maxVal = max; } public boolean stopCellEditing() { Object o = getCellEditorValue(); try { double d = Double.parseDouble(o.toString()); if (d >= minVal && d <= maxVal) return super.stopCellEditing(); } catch (NumberFormatException e) {} JOptionPane.showMessageDialog(null, "Vložte prosím číslo v rozsahu " + minVal + " .. " + maxVal, "Chyba", JOptionPane.ERROR_MESSAGE); return false; } }
Příklad ukazuje, jak by vypadal editor akceptující pouze reálná čísla, případně
s omezením jejich rozsahu. Předefinováváme metodu
V tomto případě se nejprve zkusí editovaný řetězec parsovat podle
formátu typu double. Selže-li to (nejedná se o číslo), skončí to výjimkou
Použití editoru je velice podobné jako v případě rendereru. Prostě se nastaví
tabulce (
Dále je potřeba si uvědomit, že abstraktní třída všech editorů je společná
- Za esteticky vypadajícími aplikacemi......se vydáme v příštím dílu. Ten bude zaměřen na správce rozložení (layout managery), umožňující automatické řízení rozměrů a pozice komponent podle uživatelské činnosti. V rychlosti se také podíváme na problematiku "zaměření" (fokusu) komponent, protože se - možná trochu překvapivě - jedná o docela užitečné mechanismy.
Související články
Předchozí Celou kategorii (seriál) Další
Programování v jazyku Java (1) - Úvod
Programování v jazyku Java (2) - instalace, překlad a spouštění Programování v jazyku Java (3) - Základy syntaxe Programování v jazyku Java (4) - Proměnné a operace s nimi Java (5) - Řízení programu Programování v jazyku Java (6) - Řetězce I Programování v jazyku Java (7) - Řetězce II Programování v jazyku Java (8) - Pole I Programování v jazyku Java (9) - Pole II Java (10) - Kontejnery I. Java (11) - Kontejnery II. Java (12) - Kontejnery III. Java (13) - JDK, vývojová prostředí Java (14) - štábní kultura, specifika Java (15) - I/O operace I. Java (16) - I/O operace II. Java (17) - práce se soubory Java (18) - síťová komunikace I. Java (19) - síťová komunikace II. Java (20) - vlákna Java (21) - datové typy Java 5 - recenze knihy Java (22) - omezování práv I. Java (23) - omezování práv II. Java (24) - úvod do grafiky a GUI Java (25) - základní grafické třídy Java (26) - tvorba GUI Java (27) - seznamy, stromy, tabulky Java (29) - správci rozložení Java (30) - Look and Feel Java (31) - základy tisku Java (32) - tiskové služby BlueJ IDE JavaFX - prostředí pro tvorbu RIA aplikací (1) Java a rozšířené atributy souborů JavaFX - prostředí pro tvorbu RIA aplikací (2) Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | |||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |