14.4 Grundlegendes zum Zeichnen
 
Nachdem wir ein Fenster öffnen können, wollen wir etwas in den Fensterinhalt schreiben. In den nächsten Abschnitten beschäftigen wir uns intensiver mit den Zeichenmöglichkeiten.
14.4.1 Die paint()-Methode
 
Als einleitendes Beispiel soll uns genügen, einen Text zu platzieren. Dafür implementieren wir die Funktion paint() der Frame-Klasse. Indem wir point() implementieren, wird der gewünschte Inhalt immer dann gezeichnet, wenn das Fenster neu aufgebaut wird oder wir von außen repaint()aufrufen.
Listing 14.4
Biene.java
import java.awt.*;
import java.awt.event.*;
public class Biene extends Frame
{
public Biene()
{
setSize( 500, 100 );
addWindowListener( new WindowAdapter() {
public void windowClosing ( WindowEvent e) {
System.exit(0); }
});
}
public void paint( Graphics g )
{
g.drawString( "\"Maja, wo bist du?\" (Mittermeier)", 100, 60 );
}
public static void main( String args[] )
{
new Biene().show();
}
}
Abbildung 14.2
Ein Fenster mit gezeichnetem Inhalt
|
Ein spezieller Wert wird in der paint()-Methode übergeben – der Grafikkontext, ein Objekt vom Typ Graphics. Graphic, besitzt verschiedene Methoden zum Zeichnen, etwa von Linien, Kreisen, Ovalen, Rechtecken, Zeichenfolgen oder Bildern. Das grafische System übergibt unserem Programm über paint() ein gültiges Graphics-Objekt und wir können auf diese Weise auf der grafischen Oberfläche zeichnen. Dies funktioniert auch dann, wenn die Zeichenfläche nicht direkt sichtbar ist, wie bei Hintergrundgrafiken.
Bei jeder Zeichenoperation muss der Grafikkontext angegeben werden, denn dieses Objekt führt Buch über mehrere Dinge:
|
Die Komponente, auf der zu zeichnen ist (hier erst einmal das rohe Fenster). |
|
Koordinaten des Bildbereichs und des Clipping-Bereichs. Die Zeichenoperationen außerhalb des Clipping-Bereichs werden nicht angezeigt. Daher wird ein Clipping-Bereich auch Beschnitt-Bereich1
genannt. |
|
Der aktuelle Clip-Bereich und Font, die aktuelle Farbe. |
|
Die Pixeloperation (XOR2
oder Paint). |
|
Die Funktion, mit der die Farbe verknüpft wird. |
Wir können nur in der paint()-Methode auf das Graphics-Objekt zugreifen. Diese wiederum wird immer dann aufgerufen, wenn die Komponente neu gezeichnet werden muss. Dies nutzen wir dafür, um einen Text zu schreiben.
Leicht ist zu entnehmen, dass drawString(String text, int x, int y) einen Text in den Zeichenbereich des Grafikkontexts schreibt. Im Folgenden werden wir noch weitere Funktionen kennen lernen.
Hinweis Höhe der Titelleiste: Etwas ungewöhnlich ist, dass der Nullpunkt nicht oben rechts in den sichtbaren Bereich fällt, sondern dass der Ursprung von der Titelleiste überdeckt wird. Um an die Höhe der Titeleiste zu kommen und die Zeichenoperationen so zu verschieben, dass sie in den sichtbaren Bereich fallen, wird ein java.awt.Insets-Objekt benötigt. Ist f ein Frame-Objekt, liefert f.getInserts().top die Höhe der Titelleiste.
|
14.4.2 Auffordern zum Neuzeichnen mit repaint()
 
Die Methode repaint() kann von außen aufgerufen werden, um ein Neuzeichnen zu erzwingen.
Beispiel Bei einer Animation wird zu bestimmen Zeiten der Bildschirminhalt neu aufgebaut.
Das Neuzeichnen wird mit repaint() initiiert, anschließend kann der Programmcode in der update()- beziehungsweise paint()-Methode den Bildschirm neu füllen. Damit die Animation flüssig wirkt, kann ein endlos laufender Thread zu festen Zeiten immer das repaint() auslösen. Das sieht dann wie folgt aus, wenn run() zu einem Thread gehört:
public void run() {
while (true)
component.repaint( time );
}
time ist eine Konstante, die die Zeit festsetzt, in der die Komponente component einen Aufrufzum Neuzeichnen bekommt. Da wir bisher ohne Komponenten gearbeitet haben, reicht ein repaint() auf dem Frame oder Applet.
|
1
Das Wort erspare ich den Lesern.
2
Zur Bewegung des Grafik-Cursors wird gerne eine XOR-Operation eingesetzt. Obwohl dies absolut einfach erscheint, ist die Realisierungsidee patentiert.
|