Kleines Nachschlagewerk Informatik
Grafik
Worum geht es?
Auf dieser Seite sollen einige grundlegende Dinge zu einfacher 2D-Grafik besprochen werden. Basis ist ein einfaches Programm mit Fenster, wie es im Kapitel zu NetBeans beschrieben wurde.
Die paint-Methode
... ist etwas anders. Es gibt eine Routine, die alle Grafikbefehle beinhaltet. Sie wird aufgerufen, wenn sich das Fenster neu zeichnen muss. Diese Routine kann nie direkt aufgerufen werden, man kann ein Neuzeichnen nur anmelden.

Zuerst fügt man die Routine, deren Name paint ist, dem Quelltext hinzu. NetBeans bietet danach an, einige Importe einzufügen. Dies bestätigt man.

      public void paint(Graphics graphics)
      {
          super.paint(graphics);
          // Hier folgen die eigenen Zeichenbefehle
      }
            
Das Graphics-Objekt (welches hier den Namen graphics bekommen hat) ist eine Art Zeichenstift. Hiermit kann man Farben auswählen und Zeichenbefehle aufrufen.

Die Zeile super.paint(graphics) ruft paint der übergeordneten Klasse aus (siehe dazu im Kapitel über OOP). Hier bedeutet dies nur, dass der Fensterrahmen und Fensterinhalt gezeichnet werden (inklusive aller Button etc.). Erst danach können eigene Grafikbefehle kommen, die auf das bisherige Fenster zeichnen.
repaint()
Paint wird beim Programmstart automatisch aufgerufen. Möchte man später erneut paint aufrufen, geht dies nur über repaint(). repaint() meldet den Zeichenwunsch an und Java entscheidet selbst, wann gezeichnet wird (i.A. sofort).

Diesen Befehl kann man zum Beispiel in die actionPerformed-Routine eines Button schreiben. Drückt man den Button, wird erneut gezeichnet.

      private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
          // TODO add your handling code here:
          repaint();
      }
            
Ein Beispiel mit Linien
Ein Beispiel soll verdeutlichen, wie Grafikbefehle verwendet werden. Dazu gibt es ein Pixelraster, dessen Nullpunkt links oben im Fenster liegt. Wie in der Mathematik zählt x nach links, y jedoch nach unten. Ein Beispielfenster hat die Maße von knapp 400 mal 400 Pixel.





Das Beispielprogramm ist sehr einfach und zeichnet nur ein paar Linien.

      public void paint(Graphics graphics)
      {
          int i, schrittweite;
          super.paint(graphics);
          int anzahl = Integer.parseInt(jTextField1.getText());
          schrittweite = 350 / anzahl;
          for (i = 0; i < anzahl; i++)
         {
              graphics.drawLine(20  + i * schrittweite, 80,
                                330 - i * schrittweite, 280);
          }
      }
            
Wesentlich ist der drawLine-Befehl. Er benötigt einen Anfangs- und einen Endpunkt, jeweils mit x- und y-Koordinate. drawLine ist ein Befehl des Graphics-Objektes, welches noch viel mehr kann.

Das Ergebnis könnte so aussehen.



Weitere Grafikbefehle
Alle Grafikbefehle aufzuzählen, ist sicher wenig sinnvoll. Eine kurze Liste der wichtigsten soll gegeben werden, alle anderen findet man leicht über die Doks oder die Autovervollständigung. Ein kurzes Beispiel soll dies demonstrieren.

      for (int i = 0; i < 3; i++)
      {
          graphics.drawRect(20 + 10 * i,  80 + 10 * i,
                            200 - 20 * i, 140 - 20 * i);
      }
      graphics.drawOval(80, 110, 80, 80);
      graphics.drawString("Hallo Oma!", 87, 155);
            
Alle brauchen x und y des Startpunktes, weiterhin brauchen Ellipsen und Rechtecke die Ausdehnung, also Breite und Höhe. Das Ergebnis sieht dann so aus.



Farben
Farben kann man auf zwei Arten verwnden. Zum einen kann man vordefinierte Farben nehmen.

      graphics.setColor( Color.red );
            
Die Zahl vordefinierter Farben (auch hier hilft die Autovervollständigung) ist begrenzt. Man kann sich Farben selbst definieren.

Farben (im additiven System, welches selbstleuchtende Geräte, wie Monitore verwenden) werden aus den Anteilen Rot, Grün und Blau zusammen gesetzt. Die Werte für die einzelnen Anteile können zwischen 0 und 255 (Größe eines Bytes) liegen. Sind alle Werte 0, so hat man schwarz, sind alle 255, so ergibt sich die Farbe weiß.

Ein kleines Beispiel soll die Anwendung demonstrieren.

      int i, j;
      for (i = 0; i < 256; i++)
      {
          for (j = 0; j < 256; j++)
          {
              Color farbe = new Color(i, 0, j);
              graphics.setColor(farbe);
              graphics.drawLine(20 + i, 80 + j, 20 + i, 80 + j);
          }
      }
            
In diesem Beispiel ist der Grün-Anteil 0. In x-Richtung wird das Bild immer roter, in y-Richtung immer blauer. Das Ergebnis sieht dann so aus.



DoubleBuffering
Neu