Graphics überschreiben

Cymatoxa

Mitglied
Hi,
gibt es die Möglichkeit die Klasse Graphics bzw. Graphics2D zu überschreiben, um weitere Methoden hinzuzufügen?

Grüße, Cymatoxa
 
Ich bin mir nicht sicher wie du das meinst.
Aber vllt. hilft dir das Beispiel weiter:
Java:
import java.awt.*;

public class haus extends Frame
{
  public haus()
  {
    setSize(600,600);
    show();
  }
  
  public void haus(Graphics g, int x, int y)
  {
   g.drawRect(x,y,x+100,y+100);
   g.drawLine(x,y,x+200,y+200);
   g.drawLine(x,y+200,x+200,y);
   g.drawLine(x,y,x+100,y-50);
   g.drawLine(x+100,y-50,x+200,y);
  }
  
  public void paint(Graphics g)
  {
   haus(g,100,100);
   haus(g,300,100);
  }
  
  public static void main(String args[])
  {
    haus h = new haus();
  }
}
 
Prinzipiell kannst du jede Klasse überschreiben, die nicht als 'final' markiert ist.

Allerdings bringt dir das hier recht wenig, da du von der Methode paint() bzw. paintComponent() ein Graphics-Objekt bekommst. Dieses kannst du nur zu einem Graphics2D casten, nicht aber in jede beliebige Klasse.
Sinnvoller wäre es in deinem Fall, eine Utilities-Klasse mit statischen Methoden zu bauen.

Beispiel:
Angenommen, du willst eine Methode nutzen, die einen Kreis zeichnet.

Hier die Utilities-Klasse:
Java:
public class GraphicsUtilities
{
   public static void drawCircle(Graphics g, int x, int y, int radius)
   {
      g.drawOval(x, y, radius*2, radius*2);
   }
}

Und der Code, der es nutzt:
Java:
//…

// irgend was in der Methode paintComponent();
GraphicsUtilities.drawCircle(g, 10, 10, 5);

//…
 
Danke erstmal. Ich hab die Klasse Graphics überschrieben (hab meine Klasse GraphicsPlus gennant).
Obwohl sie mit Graphics2D fast identisch war ließ sich das Graphics-Objekt nicht in eine GraphicsPlus-Objekt casten.
Java:
@Override
    public void paint(Graphics g) {
        GraphicsPlus gp = (GraphicsPlus) g;
    }
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sun.java2d.SunGraphics2D cannot be cast to game.GraphicsPlus
Gemalt wird also nicht direkt mit der Graphics-Klasse, sondern in sun.java2d.SunGraphics2D.
Ich hatte trotzdem gehofft, dass sich Graphics bzw. Graphics2D erweitern ließe. Aber das ist dann wohl nicht so einfach möglich oder? Ich werde dann weiterhin Methoden benutzen müssen, die ein Graphics-Objekt übergeben...
Grüße und gute Nacht, Cymatoxa
 
Erweitern lässt sie sich. Aber nicht casten. Du kannst ein Objekt nur zu der Klasse casten, dessen Instanz es ist. In deinem Fall würde das bedeuten, dass die JRE mit einem GraphicsPlus -Objekt arbeiten müsste - das kann sie nicht, weil ihr niemand das gesagt hat!

Eine weitere Möglichkeit gibt es noch:
Statt eine Instanz von GraphicsPlus durch casten zu erzeugen, kannst du sie auch einfach per Constructor erstellen:
statt
Java:
GraphicsPlus gp = (GraphicsPlus) g;
einfach
Java:
GraphicsPlus gp = new GraphicsPlus(g);
Logischerweise musst du der Klasse GraphicsPlus dann noch einen Constructor geben, der Objekte vom Typ Graphics / Graphics2D verarbeiten kann.
 
Danke, klingt sinnvoll. Inwiefern das funktioniert werde ich morgen oder nachher mal testen.

Edit:
Leider hab ich keine Vorstellung davon, was ich mit dem im Konstruktor übergebenen Graphics-Objekt anstellen muss. Ich glaube eine Erweiterung der Graphics-Klasse (wie mit Graphics2D) bleibt den sun-Programmierern überlassen. Ich werde es mit Methoden, die Graphics-Objekte annehmen lösen müssen, so wie du vorgeschlagen hast.
 
Zuletzt bearbeitet:
Zurück