Programování

Používání třídy Graphics

K psaní softwarových programů inspirují lidi různé faktory. Věřím, že pro mnohé motivace pramení z touhy vytvářet grafiku, manipulovat s obrázky nebo animovat. Ať už chtějí vytvářet arkádové hry, letové simulátory nebo balíčky CAD, vývojáři často začínají učením kreslit.

Sada grafických nástrojů v nástroji Abstract Windowing Toolkit (nebo AWT) umožňuje programátorovi Java kreslit jednoduché geometrické tvary, tisknout text a umisťovat obrázky do okrajů komponenty, jako je rámeček, panel nebo plátno.

Tento sloupec je můj první na téma grafiky. Zaměří se na Grafika třídy a její metody kreslení jednoduchých geometrických tvarů a představí proces, při kterém dochází k malování (a malování).

Začněme ve středu pozornosti - Grafika třída.

Třída Graphics

Je nezbytné, aby programátoři rozuměli Grafika třídy, než se pokusí nakreslit obrázky pomocí Javy. The Grafika třída poskytuje rámec pro všechny grafické operace v rámci AWT. Hraje dvě různé, ale související role. Nejprve je to grafický kontext. Grafický kontext jsou informace, které ovlivní operace kreslení. To zahrnuje barvy pozadí a popředí, písmo a umístění a rozměry ořezového obdélníku (oblast komponenty, ve které lze kreslit grafiku). Zahrnuje dokonce informace o konečném cíli samotných grafických operací (obrazovka nebo obrázek). Zadruhé Grafika třída poskytuje metody pro kreslení jednoduchých geometrických tvarů, textu a obrázků do grafického cíle. Veškerý výstup do grafického cíle probíhá prostřednictvím vyvolání jedné z těchto metod.

Aby bylo možné kreslit, program vyžaduje platný grafický kontext (představovaný instancí Grafika třída). Protože Grafika třída je abstraktní základní třída, nelze ji vytvořit přímo. Instanci obvykle vytváří komponenta a předává se do programu jako argument komponenty Aktualizace() a malovat() metody. Tyto dvě metody spolu s překreslit () Tato metoda je popsána v následující části.

Metody

Při zobrazování grafiky jsou zahrnuty následující tři metody. Výchozí verze každé z nich poskytuje třída Součástka. Metody Aktualizace() a malovat() by mělo být předefinováno pro provedení požadovaných grafických operací.

překreslit ()

public void repaint () public void repaint (long tm) public void repaint (int x, int y, int w, int h) public void repaint (long tm, int x, int y, int w, int h)

The překreslit () metoda požaduje, aby byla součást překreslena. Volající může požadovat, aby k překreslení došlo co nejdříve, nebo může určit časové období v milisekundách. Pokud je zadáno časové období, operace malování proběhne před uplynutím časového období. Volající může také určit, že má být překreslena pouze část součásti. Tato technika je užitečná, pokud je operace barvy časově náročná a pouze část displeje musí být překreslena. Kód v seznamu 1 ilustruje, jak překreslit () metoda může být použita v programu.

boolean mouseDown (Událost e, int x, int y) {selected_object.move (x, y); překreslit (); }

Výpis 1: Obsluha události myší dolů

Kód v mouseDown () obslužná rutina události přepočítá polohu objektu na displeji na základě polohy myši a zavolá překreslit () metoda, která označuje, že displej by měl být co nejdříve překreslen.

Aktualizace()

aktualizace veřejných prázdnin (Grafika g)

The Aktualizace() metoda se volá v reakci na a překreslit () na žádost nebo v reakci na část komponenty, která je odkryta nebo zobrazena poprvé. Jediným argumentem metody je instance Grafika třída. The Grafika instance je platná pouze v kontextu Aktualizace() metoda (a všechny metody, které volá), ale je zlikvidována brzy po Aktualizace() metoda se vrací. Výchozí implementace poskytovaná Součástka třída vymaže pozadí a zavolá malovat() metoda (níže).

malovat()

public void paint (Grafika g)
The malovat() metoda se volá z Aktualizace() a je zodpovědný za skutečné kreslení grafiky. Jediným argumentem metody je instance Grafika třída. Výchozí implementace poskytovaná třídou Součástka nic nedělá. 

Jak jsou komponenty přelakovány

Chcete-li zkrátit čas potřebný k překreslení displeje, AWT má dvě zkratky:

  • Za prvé, AWT překreslí pouze ty komponenty, které je třeba překreslit, buď proto, že byly odkryty, nebo proto, že požádaly o překreslení.

  • Zadruhé, pokud byla součást zakryta a je odkryta, AWT překreslí pouze část součásti, která byla dříve zakryta.

Applet na obrázku 1 umožňuje sledovat tento proces, jak k němu dochází. Na chvíli ignorujte textovou oblast v horní části appletu a sledujte pouze barevnou část displeje. Pomocí jiného okna na okamžik zakryjte a poté odkryjte část appletu. Všimněte si, že je překreslena pouze část appletu, která byla pokryta. Kromě toho jsou překresleny pouze ty komponenty, které byly pokryty, bez ohledu na jejich pozici v hierarchii komponent. Díky záměrnému použití různých barev je tento jemný efekt patrný z appletu. Zdrojový kód tohoto obrázku je k dispozici zde.

Obrázek 1: Přebarvit prohlížeč

Grafický souřadnicový systém

Metody popsané v následující části berou jako parametry hodnoty, které určují, jak má být tvar nakreslen. Například drawLine () metoda očekává čtyři parametry. První dva parametry určují umístění začátku řádku a poslední dva parametry určují umístění konce řádku. Přesné hodnoty, které mají být předány do drawLine () Metoda je určena platným souřadným systémem.

Souřadnicový systém je metoda pro jednoznačné určení umístění bodů v prostoru. V případě AWT je tímto prostorem dvourozměrný povrch nazývaný rovina. Každé místo v rovině lze určit dvěma celými čísly, které se nazývají X a y souřadnice. Hodnoty X a y souřadnice se počítají z hlediska příslušného vodorovného a svislého posunutí bodu od počátku. V případě AWT je počátkem vždy bod v levém horním rohu roviny. Má hodnoty souřadnic 0 (pro X) a 0 (pro y). Ilustrace na obrázku 2 ukazuje dva body - jeden umístěný v počátku a druhý v poloze sedm napříč a pět dolů od počátku.

Obrázek 2: Souřadnicová rovina

Grafická primitiva

Tato část představuje metody kreslení čar, obdélníků, oválek a oblouků a mnohoúhelníků. Protože tyto metody fungují pouze při vyvolání na platném Grafika mohou být použity pouze v rámci rozsahu komponenty Aktualizace() a malovat() metody. Většina následujících metod přichází ve dvojicích. Jedna metoda ( drawX () metoda) nakreslí pouze obrys zadaného tvaru a další metoda ( fillX () metoda) nakreslí vyplněnou verzi zadaného tvaru.

řádky

void drawLine (int xBegin, int yBegin, int xEnd, int yEnd)

Toto je nejjednodušší ze všech grafických metod. Nakreslí přímku, široký jeden pixel, mezi zadaným počátečním a koncovým bodem. Výsledný řádek bude oříznut, aby se vešel do hranic aktuální oblasti oříznutí. Čára bude nakreslena v aktuální barvě popředí.

Applet na obrázku 3 ukazuje drawLine () metoda v akci. Zdrojový kód je k dispozici zde. Tento applet a applety na obrázcích 4, 6 a 7 vyžadují služby dvou tříd podpory: třídy NewCanvas a rozhraní obrázku. Třída NewCanvas rozšiřuje třídu Canvas a poskytuje speciální kreslicí plochu pro postavy. Zdrojový kód pro třídu NewCanvas je k dispozici zde. Rozhraní Obrázek definuje metody, které musí obrázek poskytnout, aby mohly být použity s NewCanvas. Zdrojový kód rozhraní Figure je k dispozici zde.

Obrázek 3: Ukázka perokresby

obdélníky
void drawRect (int x, int y, int w, int h) void fillRect (int x, int y, int w, int h) void drawRoundRect (int x, int y, int w, int h, int arcWidth, int arcHeight ) void fillRoundRect (int x, int y, int w, int h, int arcWidth, int arcHeight) void draw3DRect (int x, int y, int w, int h, boolean raised) void fill3DRect (int x, int y, int w, int h, boolean raise)

Každá z těchto grafických metod vyžaduje jako parametry souřadnice xay, od kterých má začínat obdélník, a šířku a výšku obdélníku. Šířka i výška musí být kladná celá čísla. Výsledný obdélník bude oříznut, aby se vešel do hranic aktuální oblasti oříznutí. Obdélník bude vykreslen v aktuální barvě popředí. Obdélníky přicházejí ve třech různých stylech: prostý, se zaoblenými rohy a s mírným (ale často neviditelným) trojrozměrným efektem.

Metody grafiky se zaobleným obdélníkem vyžadují dva další parametry, šířku oblouku a výšku oblouku, které oba řídí zaoblení rohů. Metody trojrozměrného obdélníku vyžadují další parametr, který označuje, zda by měl být obdélník propadlý nebo vyvýšený.

Aplet na obrázku 4 ukazuje tyto metody v akci. Zdrojový kód je k dispozici zde.

Obrázek 4: Demonstrace kreslení obdélníku

ovály a oblouky

void drawOval (int x, int y, int w, int h) void fillOval (int x, int y, int w, int h) void drawArc (int x, int y, int w, int h, int startAngle, int arcAngle ) void fillArc (int x, int y, int w, int h, int startAngle, int arcAngle)

Každá z těchto grafických metod vyžaduje jako parametry souřadnice x a y středu oválu nebo oblouku a šířku a výšku oválu nebo oblouku. Šířka i výška musí být kladná celá čísla. Výsledný tvar bude oříznut, aby se vešel do hranic aktuální ořezové oblasti. Tvar bude vykreslen v aktuální barvě popředí.

Metody grafiky oblouku vyžadují dva další parametry, počáteční úhel a úhel oblouku, aby bylo možné určit začátek oblouku a velikost oblouku ve stupních (ne v radiánech). Obrázek 5 ukazuje, jak jsou zadány úhly.

Obrázek 5: Specifikace úhlu

Aplet na obrázku 6 ukazuje tyto metody v akci. Zdrojový kód je k dispozici zde.

Obrázek 6: Ukázka kreslení oválu a oblouku

mnohoúhelníky

void drawPolygon (int xPoints [], int yPoints [], int nPoints) void drawPolygon (Polygon p) void fillPolygon (int xPoints [], int yPoints [], int nPoints) void fillPolygon (Polygon p)

Polygony jsou tvary vytvořené ze sekvence úseček. Každá z metod polygonové grafiky vyžaduje jako parametry souřadnice koncových bodů úsečkových segmentů, které tvoří polygon. Tyto koncové body lze určit jedním ze dvou způsobů: jako dvě paralelní pole celých čísel, jedno představující postupné X souřadnice a další představující po sobě jdoucí y souřadnice; nebo s instancí Polygon třída. The Polygon třída poskytuje metodu addPoint (), což umožňuje sestavit definici polygonu bod po bodu. Výsledný tvar bude oříznut, aby se vešel do hranic aktuální ořezové oblasti.

Aplet na obrázku 7 ukazuje tyto metody v akci. Zdrojový kód je k dispozici zde.

Obrázek 7: Demonstrace polygonu

Závěr

Věřte tomu nebo ne, těchto několik jednoduchých grafických primitiv v kombinaci se vším, co jsme za poslední měsíce pokryli (AWT, zpracování událostí, pozorovatelé atd.), Je vše, co potřebujete k napsání hromady užitečných aplikací, od hry do systémů CAD. Příští měsíc dám všechny tyto kousky dohromady a ukážu vám, co tím myslím.

Zůstaňte naladěni.

Todd Sundsted píše programy od doby, kdy byly počítače dostupné v modelech pro stolní počítače. Ačkoli se Todd původně zajímal o vytváření aplikací distribuovaných objektů v C ++, přešel na programovací jazyk Java, když se Java stala jasnou volbou pro tento druh věcí. Kromě psaní Todd poskytuje internetové a webové poradenské služby společnostem v jihovýchodních Spojených státech. : END_BIO

Další informace o tomto tématu

  • Třída Java Grafika API

    //java.sun.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Pozorovatel a pozorovatelný //www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • Efektivní uživatelské rozhraní //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Java a zpracování událostí //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • Úvod do AWT //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

Tento příběh „Používání třídy grafiky“ původně publikoval JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found