Използване на класа Графика

Различни фактори вдъхновяват хората да пишат софтуерни програми. Вярвам, че за мнозина мотивацията произтича от желанието да създават графики, да манипулират изображения или да анимират. Независимо дали искат да създават аркадни игри, симулатори на полети или CAD пакети, разработчиците често започват с ученето да рисуват.

Графичната кутия с инструменти в абстрактния прозорец (или AWT) дава възможност на програмист на Java да рисува прости геометрични фигури, да отпечатва текст и да позиционира изображения в границите на компонент, като рамка, панел или платно.

Тази колона е първата ми по темата за графиката. Той ще се съсредоточи върху Graphicsкласа и неговите методи за изчертаване на прости геометрични фигури и ще представи процеса, чрез който се извършва рисуването (и пребоядисването).

Нека започнем от централния етап - Graphicsклас.

Класът Графика

От съществено значение е програмистите да разберат Graphicsкласа, преди да се опитат да нарисуват изображения чрез Java. В Graphicsклас осигурява рамката за всички графични операции в рамките на AWT. Играе две различни, но свързани роли. Първо, това е графичният контекст. Графичният контекст е информация, която ще повлияе на операциите по рисуване. Това включва цветовете на фона и предния план, шрифта и местоположението и размерите на изрязващия правоъгълник (областта на компонент, в който могат да се рисуват графики). Той дори включва информация за евентуалното местоназначение на самите графични операции (екран или изображение). Второ,Graphicsclass предоставя методи за изчертаване на прости геометрични фигури, текст и изображения към графичната дестинация. Цялото извеждане към графичната дестинация става чрез извикване на един от тези методи.

За да рисува, една програма изисква валиден графичен контекст (представен от екземпляр на Graphicsкласа). Тъй като Graphicsкласът е абстрактен базов клас, той не може да бъде директно създаден. Екземпляр обикновено се създава от компонент и се предава на програмата като аргумент на методите на update () и paint () на компонента . Тези два метода, заедно с метода repaint () , са разгледани в следващия раздел.

Методите

Следните три метода са включени в показването на графики. Версиите по подразбиране на всяка се предоставят от класа Component. Методите update () и paint () трябва да бъдат предефинирани, за да се изпълнят желаните графични операции.

пребоядисване ()

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)

Методът за пребоядисване () изисква компонентът да бъде пребоядисан. Повикващият може да поиска пребоядисването да стане възможно най-скоро или да посочи период от време в милисекунди. Ако е посочен период от време, операцията по боядисване ще настъпи преди изтичането на периода от време. Повикващият може също така да посочи само част от компонент да бъде пребоядисана. Тази техника е полезна, ако операцията за боядисване отнема много време и само част от дисплея се нуждае от пребоядисване. Кодът в Листинг 1 илюстрира как методът за пребоядисване () може да се използва в програма.

boolean mouseDown (Събитие e, int x, int y) {selected_object.move (x, y); пребоядисване (); }

Листинг 1: Манипулатор на събития с мишка

Кодът в манипулатора на събития mouseDown () преизчислява позицията на обект в дисплей въз основа на позицията на мишката и извиква метода repaint () , за да покаже, че дисплеят трябва да бъде пребоядисан възможно най-скоро.

актуализация ()

публична актуализация на невалидни (графика g)

Методът update () се извиква в отговор на заявка за пребоядисване () или в отговор на част от компонента, който се разкрива или показва за първи път. Единственият аргумент на метода е екземпляр на Graphicsкласа. В Graphicsслучай е валиден само в рамките на актуализация () метод (и всички методи го нарича), но се изхвърлят веднага след актуализация () метод се връща. Реализацията по подразбиране, предоставена от Componentкласа, изтрива фона и извиква метода paint () (по-долу).

боя ()

публична пуста боя (графика g)
Методът paint () се извиква от метод update () и отговаря за действителното изчертаване на графиките. Единственият аргумент на метода е екземпляр на Graphicsкласа. Изпълнението по подразбиране, предоставено от клас, Componentне прави нищо.

Как се пребоядисват компонентите

За да се намали времето, необходимо за пребоядисване на дисплея, AWT взема два преки пътища:

  • Първо, AWT пребоядисва само онези компоненти, които се нуждаят от пребоядисване, или защото са били разкрити, или защото са поискали да бъдат пребоядисани.


    
  • Второ, ако компонент е бил покрит и е разкрит, AWT пребоядисва само частта от компонента, която е била предварително покрита.

Аплетът на фигура 1 ви позволява да наблюдавате този процес, докато той се случва. Игнорирайте текстовата област в горната част на аплета за момент и гледайте само цветната част на дисплея. Използвайки друг прозорец, за миг покрийте и след това разкрийте част от аплета. Забележете, че само частта от аплета, която е била покрита, е пребоядисана. Освен това, само онези компоненти, които са били покрити, се пребоядисват, независимо от тяхната позиция в йерархията на компонентите. Чрез умишлено използване на различни цветове, аплетът прави този фин ефект забележим. Изходният код за тази фигура е достъпен тук.

Фигура 1: Пребоядисайте браузъра

Графичната координатна система

Методите, описани в следващия раздел, вземат като параметри стойности, които указват как да се изчертае фигура. Например методът drawLine () очаква четири параметъра. Първите два параметъра указват местоположението в началото на реда, а последните два параметъра определят местоположението в края на реда. Точните стойности, които трябва да бъдат предадени на метода drawLine () , се определят от действащата координатна система.

Координатната система е метод за еднозначно определяне на местоположението на точките в пространството. В случая на AWT, това пространство е двумерна повърхност, наречена равнина. Всяко местоположение в равнина може да бъде зададено от две цели числа, наречени координати x и y . Стойностите на координатите x и y се изчисляват по отношение на съответното хоризонтално и вертикално изместване на точката от началото. В случая на AWT, началото винаги е точката в горния ляв ъгъл на равнината. Той има координатни стойности 0 (за x ) и 0 (за y). Илюстрацията на фигура 2 показва две точки - една, разположена в началото, и друга, разположена на позиция седем по дължината и пет надолу от началото.

Фигура 2: Координатната равнина

Графичните примитиви

Този раздел въвежда методи за изчертаване на линии, правоъгълници, овали и дъги и полигони. Тъй като тези методи работят само при извикване на валиден Graphicsекземпляр, те могат да се използват само в обхвата на методите за актуализация () и боя () на компонента . Повечето от методите, които следват, идват по двойки. Единият метод (методът drawX () ) изчертава само контурите на посочената форма, а другият метод (методът fillX () ) изчертава попълнена версия на посочената форма.

линии

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

Това е най-простият от всички графични методи. Изчертава права линия, широка един пиксел, между посочените начални и крайни точки. Получената линия ще бъде изрязана, за да се побере в границите на текущата област на изрязване. Линията ще бъде изчертана в текущия цвят на преден план.

Аплетът на фигура 3 показва метода drawLine () в действие. Изходният код е достъпен тук. Този аплет и аплетите на фигури 4, 6 и 7 изискват услугите на два класа за поддръжка: клас NewCanvas и интерфейс на фигурата. Класът NewCanvas разширява класа Canvas и осигурява специализирана повърхност за рисуване на фигури. Изходният код за класа NewCanvas е достъпен тук. Интерфейсът на фигурата дефинира методите, които фигурата трябва да предоставя, за да се използва с NewCanvas. Изходният код за интерфейса на Фигурата е достъпен тук.

Фигура 3: Демонстрация на чертане на линии

правоъгълници
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 повдигнато) void fill3DRect (int x, int y, int w, int h, булево повдигнато)

Всеки от тези графични методи изисква като параметри координатите x и y, с които да започне правоъгълника, както и ширината и височината на правоъгълника. Както ширината, така и височината трябва да бъдат положителни цели числа. Полученият правоъгълник ще бъде изрязан, за да се побере в границите на текущата област на изрязване. Правоъгълникът ще бъде изчертан в текущия цвят на преден план. Правоъгълниците се предлагат в три различни стила: обикновен, със заоблени ъгли и с лек (но често трудно забележим) триизмерен ефект.

Графичните методи със заоблен правоъгълник изискват два допълнителни параметъра, ширина на дъгата и височина на дъгата, като и двете контролират закръгляването на ъглите. Методите за триизмерен правоъгълник изискват допълнителен параметър, който показва дали правоъгълникът трябва да бъде потънал или не.

Аплетът на фигура 4 демонстрира тези методи в действие. Изходният код е достъпен тук.

Фигура 4: Демонстрация на рисуване с правоъгълник

овали и дъги

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)

Всеки от тези графични методи изисква като параметри координатите x и y на центъра на овала или дъгата, както и ширината и височината на овала или дъгата. Както ширината, така и височината трябва да бъдат положителни цели числа. Получената фигура ще бъде изрязана, за да се побере в границите на текущата област на изрязване. Формата ще бъде изчертана в текущия цвят на преден план.

The arc graphics methods require two additional parameters, a start angle and an arc angle, to specify the beginning of the arc and the size of the arc in degrees (not radians). Figure 5 illustrates how angles are specified.

Figure 5: Angle specification

The applet in Figure 6 demonstrates these methods in action. The source code is available here.

Figure 6: Oval and arc drawing demonstration

polygons

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

Polygons are shapes formed from a sequence of line segments. Each of the polygon graphics methods require, as parameters, the coordinates of the endpoints of the line segments that make up the polygon. These endpoints can be specified in either one of two ways: as two parallel arrays of integers, one representing the successive x coordinates and the other representing the successive y coordinates; or with an instance of the Polygon class. The Polygon class provides the method addPoint(), which allows a polygon definition to be assembled point by point. The resulting shape will be clipped to fit within the boundaries of the current clipping region.

The applet in Figure 7 demonstrates these methods in action. The source code is available here.

Фигура 7: Демонстрация на рисуване на многоъгълник

Заключение

Вярвате или не, тези няколко прости графични примитива, съчетани с всичко, което сме обхванали през последните няколко месеца (AWT, обработка на събития, наблюдатели и т.н.), са всичко, от което се нуждаете, за да напишете куп полезни приложения, вариращи от игри към CAD системи. Следващият месец ще събера всички тези парчета и ще ви покажа какво имам предвид.

Останете на линия.

Тод Съндстед пише програми, откакто компютрите стават достъпни в настолни модели. Въпреки че първоначално се интересуваше от изграждането на разпределени обектни приложения в C ++, Тод премина към езика за програмиране Java, когато Java стана очевидният избор за такъв тип неща. В допълнение към писането, Тод предоставя интернет и уеб консултантски услуги на компании в югоизточната част на САЩ. : END_BIO

Научете повече за тази тема

  • GraphicsAPI на Java Class

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

  • Наблюдател и наблюдаем //www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • Ефективният потребителски интерфейс //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Java и обработка на събития //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • Въведение в AWT //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

Тази история „Използване на графичен клас“ първоначално е публикувана от JavaWorld.