Java - Grafika (59.díl)

Napsal O webu (») 5. 9. 2008 v kategorii Programování, přečteno: 9854×
obrazky/java_logo.png

Grafika

V této 48sti se seznámíme se základy grafiky v Javě naučíme se kreslit na obrazovku, používat barvy či načíst rastr. Budeme pracovat s třídou Graphics, která umožňuje základní grafické operace. Pro pokročilejší kresbu lze použít třídu Graphics2D. Uveďme pro úplnost, že v Javě můžeme kreslit jak 2D, tak i 3D. Existuje velké množství tříd obsahujících nástroje provádějící řadu pokročilých grafckých operací jako rendering, animaci, práce s multimédii. Java dokáže využívat knihovny OpenGL. Nebudeme využívat rozhraní AWT, ale Swing.

Rychlost grafiky v Javě. Často používaným argumentem je, že grafika v Javě je pomalá. Tento nedostatek se projevoval zejména u prvních verzí jazyka Java. Rychlost kódu byla až 30 nižší než u kompilovaného C++, v současné době je Java cca 2x pomalejší než C++ (přibližný údaj). Grafku v Javě můžeme považovat za poměrně rychlou.

Kdy dojde k vykreslení obrazu? Při kreslení v Javě za použití třídy Graphics nemůžeme přesně určit okamžik, kdy dojde k vykreslení obrazu. Kresba je provedena v okamžiku, kdy to grafické rozhraní považovat za nezbytné. Překreslení obrazu však můžeme vyvolat uměle prostřednictvím metody repaint().

Tento způsob je poněkud nezvyklý, vede však uživatele k tomu, že není možné na plochu okna kreslit bez systému v okamžiku, kdy se mu zrovna zachce. Je způsoben tím, že vykreslování nesmí být přerušeno žádnou jinou činností, proto JVM vyčkává na vhodný okamžik. Vykreslování probíhá hierarchicky od komponent s vyšší hierarchií sestupně ke komponentám s nižší hierarchií.

Double buering. Java podporuje pro zvýšení kvality vykreslování techniku double bueringu. Vykreslování v takovém případě neprobíhá po částech na komponentě, ale ve specializovaném bueru v paměti. Po vykreslení do bueru je obrázek přenesen na komponentu. Výsledkem je kvalitnější obraz než při
klasickém přístupu.

Kreslící plocha má v Javě tvar obdélníka. Pro zvýšení rychlosti vykreslování se v Javě často používá trik, kdy komponenty označíme za průhledné. Grafické rozhraní pak nemusí ztrácet čas s jejich vykreslováním. Vykreslování probíhá na plátno komponenty, které se nazývá Canvas.

Metody pro kreslení ve Swingu. Jak jsme uvedli v úvodu, při překreslování je používán hierarchický model realizovaný trojicí metod.
  • Metoda paintComponent() je nejdůležitější metodou, která se používá při překreslování komponent. Nejprve provádí překreslení pozadí, poté provádí vykreslení grafiky. Tato metoda může, a často bývá, uživatelem předefinována, umožňuje mu ovlivnit způsob vykreslování vlastní grafiky.

  • Následně metoda paintBorder() provede vykreslení okraje komponenty. Tato metoda by neměla být uživatelem předefinovávána.

  • Metoda paintChildren() provede vykreslení komponent na hierarchicky nižší úrovni. Ani tato metoda by neměla být uživatelem předefinována. Překreslení plochy Překreslení plochy komponenty je provedeno po vyvolání metody repaint(). Tato metoda zavolá nejprve metodu update(), která přes komponentu nakreslí vyplněný obdélník v barvě pozadí a tak vlastně kresbu vymaže. Následně je zavolána metoda paintComponent(), která provede vykreslení. Vyvoláním metody repaint() dojde vždy k smazání původní kresby.

    Metoda repaint je přetížená, uveďme některé prototypy:
    repaint();
    repaint(int time);
    repaint(int time, int x, int y, int width, int heigh);

    První metoda provede překreslení v okamžiku, kdy to systém uzná za vhodné, druhá v zadaném čase v milisekundách, třetí překreslí pouze oblast zadanou výřezem v zadaném čase v milisekundách.
    Autor: Filip Koval
  • Štítky: Java
    Facebook Twitter Topčlánky.cz Linkuj.cz

    Komentáře

    Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
    kokot z IP 89.103.74.*** | 14.3.2010 14:27
    <h1>ahoj lidi</h1>


    Nový komentář

    Téma:
    Jméno:
    Notif. e-mail *:
    Komentář:
      [b] [obr]
    Odpovězte prosím číslicemi: Součet čísel jedenáct a jedenáct