Verwenden der Grafikklasse

Eine Vielzahl von Faktoren inspiriert Menschen, Softwareprogramme zu schreiben. Ich glaube, dass für viele die Motivation aus dem Wunsch entspringt, Grafiken zu erstellen, Bilder zu manipulieren oder zu animieren. Unabhängig davon, ob sie Arcade-Spiele, Flugsimulatoren oder CAD-Pakete erstellen möchten, lernen Entwickler häufig zunächst das Zeichnen.

Die Grafik-Toolbox im Abstract Windowing Toolkit (oder AWT) ermöglicht es einem Java-Programmierer, einfache geometrische Formen zu zeichnen, Text zu drucken und Bilder innerhalb der Ränder einer Komponente wie eines Rahmens, eines Bedienfelds oder einer Leinwand zu positionieren.

Diese Kolumne ist meine erste zum Thema Grafik. Es wird sich auf die GraphicsKlasse und ihre Methoden zum Zeichnen einfacher geometrischer Formen konzentrieren und den Prozess vorstellen, mit dem gemalt (und neu gestrichen) wird.

Beginnen wir im Mittelpunkt - der GraphicsKlasse.

Die Grafikklasse

Es ist wichtig, dass Programmierer die GraphicsKlasse verstehen , bevor sie versuchen, Bilder über Java zu zeichnen. Die GraphicsKlasse bietet das Framework für alle Grafikoperationen innerhalb der AWT. Es spielt zwei verschiedene, aber verwandte Rollen. Erstens ist es der Grafikkontext. Der Grafikkontext besteht aus Informationen, die sich auf Zeichenvorgänge auswirken. Dies umfasst die Hintergrund- und Vordergrundfarben, die Schriftart sowie die Position und Abmessungen des Schnittrechtecks ​​(den Bereich einer Komponente, in dem Grafiken gezeichnet werden können). Es enthält sogar Informationen über das mögliche Ziel der Grafikoperationen selbst (Bildschirm oder Bild). Zweitens dieGraphicsclass bietet Methoden zum Zeichnen einfacher geometrischer Formen, Texte und Bilder zum Grafikziel. Die gesamte Ausgabe an das Grafikziel erfolgt über einen Aufruf einer dieser Methoden.

Zum Zeichnen benötigt ein Programm einen gültigen Grafikkontext (dargestellt durch eine Instanz der GraphicsKlasse). Da die GraphicsKlasse eine abstrakte Basisklasse ist, kann sie nicht direkt instanziiert werden. Eine Instanz wird normalerweise von einer Komponente erstellt und dem Programm als Argument für die update () - und paint () -Methoden einer Komponente übergeben . Diese beiden Methoden werden zusammen mit der repaint () -Methode im nächsten Abschnitt erläutert.

Die Methoden

Die folgenden drei Methoden sind für die Anzeige von Grafiken erforderlich. Die Standardversionen der einzelnen Versionen werden von der Klasse bereitgestellt Component. Die Methoden update () und paint () sollten neu definiert werden, um die gewünschten Grafikoperationen auszuführen.

neu streichen ()

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)

Die Methode repaint () fordert das Neulackieren einer Komponente an. Der Anrufer kann verlangen, dass die Neulackierung so bald wie möglich erfolgt, oder er kann einen Zeitraum in Millisekunden angeben. Wenn ein Zeitraum angegeben ist, wird der Malvorgang vor Ablauf des Zeitraums ausgeführt. Der Aufrufer kann auch angeben, dass nur ein Teil einer Komponente neu gestrichen werden soll. Diese Technik ist nützlich, wenn der Malvorgang zeitaufwändig ist und nur ein Teil des Displays neu gestrichen werden muss. Der Code in Listing 1 zeigt, wie die repaint () -Methode in einem Programm verwendet werden kann.

boolean mouseDown (Ereignis e, int x, int y) {selected_object.move (x, y); repaint (); }}

Listing 1: Mouse-Down-Ereignishandler

Der Code im Ereignishandler mouseDown () berechnet die Position eines Objekts in einer Anzeige basierend auf der Position der Maus neu und ruft die Methode repaint () auf , um anzugeben, dass die Anzeige so schnell wie möglich neu gestrichen werden soll.

aktualisieren()

public void update (Grafik g)

Die update () -Methode wird als Antwort auf eine repaint () -Anforderung oder als Antwort auf einen Teil der Komponente aufgerufen, der zum ersten Mal aufgedeckt oder angezeigt wird. Das einzige Argument der Methode ist eine Instanz der GraphicsKlasse. Die GraphicsInstanz ist nur im Kontext der update () -Methode (und aller von ihr aufgerufenen Methoden) gültig , wird jedoch bald nach der Rückkehr der update () -Methode entsorgt . Die von der ComponentKlasse bereitgestellte Standardimplementierung löscht den Hintergrund und ruft die paint () -Methode (unten) auf.

Farbe()

öffentliche leere Farbe (Grafik g)
Die paint () -Methode wird von einer update () -Methode aufgerufen und ist für das eigentliche Zeichnen der Grafiken verantwortlich. Das einzige Argument der Methode ist eine Instanz der GraphicsKlasse. Die von der Klasse bereitgestellte Standardimplementierung Componentführt zu nichts.

Wie Komponenten neu lackiert werden

Um die zum Neulackieren des Displays erforderliche Zeit zu verkürzen, verwendet das AWT zwei Verknüpfungen:

  • Erstens malt das AWT nur die Komponenten neu, die neu gestrichen werden müssen, entweder weil sie freigelegt wurden oder weil sie neu gestrichen werden wollten.


    
  • Zweitens, wenn eine Komponente abgedeckt wurde und nicht abgedeckt ist, malt die AWT nur den Teil der Komponente neu, der zuvor abgedeckt wurde.

Mit dem Applet in Abbildung 1 können Sie diesen Vorgang beobachten. Ignorieren Sie den Textbereich oben im Applet für einen Moment und beobachten Sie nur den farbigen Teil des Displays. Decken Sie einen Teil des Applets in einem anderen Fenster kurz ab und decken Sie ihn dann ab. Beachten Sie, dass nur der Teil des Applets, der abgedeckt wurde, neu gestrichen wird. Darüber hinaus werden nur die Komponenten neu gestrichen, unabhängig von ihrer Position in der Komponentenhierarchie. Durch die gezielte Verwendung unterschiedlicher Farben macht das Applet diesen subtilen Effekt spürbar. Der Quellcode für diese Abbildung ist hier verfügbar.

Abbildung 1: Browser neu streichen

Das Grafikkoordinatensystem

Die im folgenden Abschnitt beschriebenen Methoden verwenden als Parameter Werte, die angeben, wie eine Form gezeichnet werden soll. Beispielsweise erwartet die drawLine () -Methode vier Parameter. Die ersten beiden Parameter geben die Position des Zeilenanfangs an, und die letzten beiden Parameter geben die Position des Zeilenende an. Die genauen Werte, die an die drawLine () -Methode übergeben werden sollen, werden vom gültigen Koordinatensystem bestimmt.

Ein Koordinatensystem ist eine Methode zur eindeutigen Angabe der Position von Punkten im Raum. Im Fall der AWT ist dieser Raum eine zweidimensionale Oberfläche, die als Ebene bezeichnet wird. Jeder Ort in einer Ebene kann durch zwei Ganzzahlen angegeben werden, die als x- und y- Koordinaten bezeichnet werden. Die Werte der x- und y- Koordinaten werden als jeweilige horizontale und vertikale Verschiebung des Punkts vom Ursprung berechnet. Bei der AWT ist der Ursprung immer der Punkt in der oberen linken Ecke der Ebene. Es hat die Koordinatenwerte 0 (für x ) und 0 (für y)). Die Abbildung in Abbildung 2 zeigt zwei Punkte - einen am Ursprung und einen an einer Position sieben gegenüber und fünf unterhalb des Ursprungs.

Abbildung 2: Die Koordinatenebene

Die Grafikprimitive

In diesem Abschnitt werden Methoden zum Zeichnen von Linien, Rechtecken, Ovalen und Bögen sowie Polygonen vorgestellt. Da diese Methoden nur funktionieren, wenn sie für eine gültige GraphicsInstanz aufgerufen werden, dürfen sie nur im Rahmen der update () - und paint () -Methoden einer Komponente verwendet werden. Die meisten der folgenden Methoden werden paarweise durchgeführt. Eine Methode (die drawX () -Methode) zeichnet nur den Umriss der angegebenen Form, und die andere Methode (die fillX () -Methode) zeichnet eine gefüllte Version der angegebenen Form.

Linien

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

Dies ist die einfachste aller Grafikmethoden. Es wird eine gerade Linie mit einer Breite von einem Pixel zwischen dem angegebenen Anfangs- und Endpunkt gezeichnet. Die resultierende Linie wird so beschnitten, dass sie in die Grenzen des aktuellen Beschneidungsbereichs passt. Die Linie wird in der aktuellen Vordergrundfarbe gezeichnet.

Das Applet in Abbildung 3 zeigt die Methode drawLine () in Aktion. Der Quellcode ist hier verfügbar. Dieses Applet und die Applets in den Abbildungen 4, 6 und 7 erfordern die Dienste von zwei Unterstützungsklassen: der NewCanvas-Klasse und der Figure-Schnittstelle. Die NewCanvas-Klasse erweitert die Klasse Canvas und bietet eine spezielle Zeichenfläche für Figuren. Der Quellcode für die NewCanvas-Klasse ist hier verfügbar. Die Figure-Schnittstelle definiert die Methoden, die eine Figure bereitstellen muss, um mit NewCanvas verwendet zu werden. Der Quellcode für die Figure-Schnittstelle ist hier verfügbar.

Abbildung 3: Demonstration der Strichzeichnung

Rechtecke
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, boolescher Wert) void fill3DRect (int x, int y, int w, int h, boolescher Wert erhöht)

Jede dieser Grafikmethoden erfordert als Parameter die x- und y-Koordinaten, an denen das Rechteck beginnen soll, sowie die Breite und Höhe des Rechtecks. Sowohl die Breite als auch die Höhe müssen positive ganze Zahlen sein. Das resultierende Rechteck wird so beschnitten, dass es in die Grenzen des aktuellen Beschneidungsbereichs passt. Das Rechteck wird in der aktuellen Vordergrundfarbe gezeichnet. Rechtecke gibt es in drei verschiedenen Ausführungen: schlicht, mit abgerundeten Ecken und mit einem leichten (aber oft schwer zu erkennenden) dreidimensionalen Effekt.

Die Grafikmethoden für abgerundete Rechtecke erfordern zwei zusätzliche Parameter, eine Bogenbreite und eine Bogenhöhe, die beide die Rundung der Ecken steuern. Die dreidimensionalen Rechteckmethoden erfordern einen zusätzlichen Parameter, der angibt, ob das Rechteck eingefallen oder angehoben werden soll.

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

Figure 4: Rectangle drawing demonstration

ovals and arcs

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)

Each of these graphics methods require, as parameters, the x and y coordinates of the center of the oval or arc, and the width and height of the oval or arc. Both the width and the height must be positive integers. The resulting shape will be clipped to fit within the boundaries of the current clipping region. The shape will be drawn in the current foreground color.

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.

Abbildung 7: Demonstration der Polygonzeichnung

Fazit

Ob Sie es glauben oder nicht, diese wenigen einfachen Grafikprimitive, kombiniert mit allem, was wir in den letzten Monaten behandelt haben (AWT, Ereignisbehandlung, Beobachter usw.), sind alles, was Sie benötigen, um eine Menge nützlicher Anwendungen zu schreiben, angefangen von Spiele zu CAD-Systemen. Nächsten Monat werde ich all diese Teile zusammenfügen und Ihnen zeigen, was ich meine.

Bleib dran.

Todd Sundsted schreibt Programme, seit Computer in Desktop-Modellen verfügbar sind. Obwohl Todd ursprünglich daran interessiert war, verteilte Objektanwendungen in C ++ zu erstellen, wechselte er zur Programmiersprache Java, als Java die offensichtliche Wahl für solche Dinge wurde. Neben dem Schreiben bietet Todd Unternehmen im Südosten der USA Internet- und Web-Beratungsdienste an. : END_BIO

Erfahren Sie mehr über dieses Thema

  • Die Java-Klassen- GraphicsAPI

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

  • Beobachter und beobachtbar //www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • Die effektive Benutzeroberfläche //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Java- und Ereignisbehandlung //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • Einführung in die AWT //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

Diese Geschichte "Using the Graphics class" wurde ursprünglich von JavaWorld veröffentlicht.