Java ist auch eine Insel

Dienstag, Mai 29, 2007

Insel: Eine Kopie von java.awt.Graphics erstellen

Das Zeichensystem übergibt an die paintXXX()-Methoden ein Graphics-Objekt, das wir zum Zeichnen oft verändern, etwa um einen Farbe für nachfolgende Operationen zu setzen. Stehen eigene Zeichenfunktion jedoch nicht am Ende der Zeichenfolge, ist es wichtig, den Grafikkontext so zu restaurieren, wie er am Anfang war, um nachfolgende Zeichenoperationen nicht zu beeinflussen. Wichtig ist dies etwa bei Swing-Komponenten, wo paint() die Methoden

  • protected void paintComponent( Graphics g )
  • protected void paintBorder( Graphics g )
  • protected void paintChildren( Graphics g )

aufruft. Nun lässt sich leicht ausmalen, was passiert, wenn unsere Funktion paintComponent() ein verhunztes Graphics-Objekt hinterlässt.

Die erste Lösung ist, sich die alten Zustände zu merken und zurückzusetzen:

Color oldColor = g.getColor();

g.setColor( newColor );

g.setColor( oldColor ); // Farbe zurücksetzten

Bei wenigen Eigenschaften funktioniert das gut, doch werden es mehr, ist es sinnvoller, eine Kopie aller Zustände des Grafik-Kontexts vorzunehmen. Dazu dient die Funktion create(). Von großer Wichtigkeit ist hier, diesen temporäreren Kontext auf jeden Fall mit dispose() wieder freizugeben, um keinen Speicherplatz zu blockieren.

@Override protected void paintComponent( Graphics g )

Graphics gcopy = g.create(); // Kopie erfragen

try {

gcopy.draw… // Alle Zeichenopertationen über gcopy

}

finally {

gcopy.dispose(); // Kopie freigeben

}

Ist definitiv keine Ausnahme zu erwarten, kann der try/catch-Block entfallen.

Labels:

AddThis Social Bookmark Button