|
|||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
bootable [55]
commercial [7] no-commercial [42] unclassified [20] [7]
Software (10844)
|
Java (25) - základní grafické třídyPři vývoji GUI pro javovské aplikace se vyplatí dobře znát některé základní třídy. I v případě, kdy za nás "černou práci" dělá grafický návrhář v IDE, pomůže znalost těchto tříd výrazně zefektivnit vývoj a snadno nalézat případné chyby.
Bez čeho se nelze obejítPřehled důležitých tříd začnu tím úplně nejzákladnějším, co bude každého doprovázet po celou dobu vývoje GUI a grafiky obecně. Dobrá práce s těmito třídami je první nutnou (nikoli postačující) podmínkou k efektivnímu vývoji kvalitních aplikací. MěřímeAť už pracujeme s jakýmkoli grafickým objektem, často potřebujeme vědět, jak je daný objekt velký a kde se nachází. Proto potřebujeme rozumný způsob, jak s těmito informacemi pracovat.
Začneme s rozměry. Máme abstraktní třídu
Třída neobsahuje (po datové stránce) nic jiného, než právě tyto celočíselné
rozměry. Instance třídy vrací některé metody, nejčastěji využijeme JLabel lab = new JLabel("text"); ... Dimension d = lab.getSize(); ... d = lab.getSize(d);
V příkladu se nejprve vytvoří instance objektu
Když už jsme u toho šetření, každý grafický objekt má také metody
U pozice objektů je to podobné. Je tu abstraktní třída Dimension d = new Dimension(100, 20); JButton but1 = new JButton("button 1"); JButton but2 = new JButton("button 2"); ... but1.setSize(d); but2.setSize(d); ...
Příklad ukazuje použití třídy
Třídy Události
Při obsluze událostí získáme v metodě vždy objekt představující příslušnou
událost. Ten nám poskytuje cenné informace o tom, co, kde a jak se stalo.
Všechny třídy pro události vycházejí z jedné společné, a to
Většina grafických událostí je odvozena od třídy
Nyní se ještě zmíním o jedné specifické třídě, která se často používá.
Je to JButton but1 = new JButton("Konec"); but1.setActionCommand("quit"); JMenuItem item1 = new JMenuItem("Konec"); item1.setActionCommand("quit"); ... public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("quit")) { ... } } Uvedený příklad ukazuje, jak by to vypadalo, kdyby se stejná akce generovala tlačítkem a položkou v menu. Rozlišovalo by se jen a pouze podle řetězce příkazu. "Bedny nástrojů"
Začneme třídou, která se objevila již v minulém dílu seriálu. Ze třídy
Jsou tu např. metody na přepočet souřadných systémů (
Zajímavé a důležité je rozhraní Grafický kontextPojem grafického kontextu úzce souvisí hlavně se samotným kreslením, ale i v GUI je velice důležitý - hlavně v případě, kdy tvoříme nějaké vlastní komponenty. Lze si ho představit jako abstraktní kreslítko, kdy sice nevíme, jak a kam se kreslí, ale zajímá nás, co se kreslí. Tedy například kružnice, obdélník, rastrový obrázek nebo text.
Obvykle se setkáme s třídou Jak takové kreslení vypadá, ukazuje příklad. Opět se nejedná o nic složitého, použití metod je velice snadné: Graphics g = ... // odněkud získáme grafický kontext g.setColor(new Color(100, 100, 100)); // tmavě šedá barva g.fillRect(0, 0, 200, 100); // šedý vyplněný obdélník g.setColor(Color.RED); // nastavíme červenou barvu g.drawOval(10, 10, 180, 80); // červená elipsa Z příkladu jsou zřejmé i základy práce s barvami (zde je v jednom případě použita barevná konstanta, ve druhém vytvoření barvy ze složek RGB). Blíže se na barvy podíváme později. Grafické komponenty
Nyní se zaměříme na třídu
Nejprve to nejjednodušší. S některými metodami jsme pracovali již minule.
Máme tu dvojice JComponent c = ... // odněkud získáme komponentu if (c.isVisible()) // pokud je komponenta viditelná, c.setEnabled(false); // deaktivujeme ji Snad je vše dostatečně zřejmé. Jen připomenu, že neaktivní komponenta nepřijímá žádné uživatelské vstupy. Ještě by se asi slušelo zmínit, že až na výjimky (na které později zvlášť upozorním) jsou ve výchozím stavu všechny komponenty aktivní a viditelné (zobrazované). Kreslení a tisk
Na kreslení se teď podíváme z té druhé strany - teď už nebudeme tedy přímo kreslit,
ale zajímá nás, jak to vypadá zvenku. Těžiště spočívá v metodě
Pokud potřebujeme v komponentě kreslit něco vlastního, máme několik možností.
První je předefinovat metodu public void paint(Graphics g) { Dimension d = getSize(); g.setColor(Color.LIGHT_GRAY); g.fill3DRect(0, 0, d.width, d.height, true); g.setColor(Color.BLACK); String s = ... // odněkud získáme řetězec Rectangle2D r = g.getFontMetrics().getStringBounds(s, g); g.drawString(s, (int) ((d.width - r.getWidth()) / 2), (int) ((d.height - r.getHeight()) / 2)); } V příkladu se nejprve nakreslí "vystouplý" obdélník. Pak se na něj umístí text obsažený v odněkud získaném řetězci. Text je vodorovně i svisle vycentrován (centruje se opsaný obdélník, proto může text v některých případech vypadat podivně) - uvedené řešení je jen jedno z možných, lze to provést i jinak. Uvedené řešení také nijak nepočítá s okraji.
Druhou možností je předefinovat
I když v naprosté většině případů nemáme žádný důvod explicitně vyžadovat
překreslení nějaké komponenty, výjimečně taková potřeba může nastat. K tomu
slouží dvě metody -
Ještě pár slov k tisku. Komponenty mají metody Rozměry
Kromě aktuálních rozměrů komponenty, se kterými se pracuje pomocí Až se zanedlouho dostaneme k layout managerům, uvedu příklad i pro tyto parametry. Zatím bych to ponechal pouze na této teoretické úrovni. Události
Když jsem popisoval mechanismus zpracování událostí, možná někoho napadlo,
jak se takové události generují. Nepočítám-li nízkoúrovňové události od okenního
systému, generují většinu událostí přímo grafické komponenty - a také
zajišťují distribuci přihlášeným odběratelům. Často poskytují přímo
mechanismus, jak lze událost vygenerovat prostým zavoláním metody s patřičnými
parametry. Tyto metody se snadno poznají podle toho, že začínají
Např. Časovač
Poslední třídou, na kterou se dnes dostane, je třída pro časovač
-
Časovač pracuje tak, že v okamžiku vypršení prodlevy (nastal čas něco provést)
přidá do fronty patřičnou událost (v aktuální implementaci stejným způsobem,
jako kdybychom zavolali class MyLabel extends JLabel implements ActionListener { javax.swing.Timer t = null; public MyLabel() { super(); t = new javax.swing.Timer(10000, this); t.start(); } public void actionPerformed(ActionEvent e) { setText(""); } }
Jedná se o rozšíření třídy Z čeho stavět?Tak to by bylo z oblasti "základních stavebních kamenů" všechno. Příště nás čekají složitější třídy frameworku Swing. Budeme z nich stavět složitější celky, podíváme se taktéž na některá úskalí, která tato oblast skýtá. Je to problematika velice zajímavá, proto doufám, že nejsem sám, kdo se na to těší.
Related article
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 (26) - tvorba GUI Java (27) - seznamy, stromy, tabulky Java (28) - renderery a editory 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) Previous Show category (serial) Next
|
Szukanie oprogramowania
|
|||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |