2012-04-13 20 views
0
public class MyDrawPanel extends JPanel { 
    public void paintComponent(Graphics g){ 

     Graphics2D gd2 = (Graphics2D) g; 
     GradientPaint gradient = new GradientPaint(70,70,Color.blue,150,150,Color.red); 


    } 
} 

Warum diese gültig ist, aber nicht so:Warum kann paintComponent kein Graphics2D-Objekt akzeptieren?

public class MyDrawPanel extends JPanel { 
    public void paintComponent(Graphics2D g){ 

     GradientPaint gradient = new GradientPaint(70,70,Color.blue,150,150,Color.red); 

     g.setPaint(gradient); 
     g.fillOval(70,70,100,100); 
    } 
} 

Zuerst eine macht, aber die zweite macht keine andere Grafiken als der Rahmen. Ich habe bemerkt, dass paintComponent() ein Graphics-Objekt benötigt, aber wenn Graphics2D eine Unterklasse des Graphics-Objekts ist, warum kann ich dann keine Unterklasse von Graphics aufrufen?

Gibt es ein Konzept, das ich nicht verstehe, warum das ist?

+2

Die kurze Antwort zu finden ist, weil es spezifischer als ein Graphics ist und somit keine gültige Überschreibung des Verfahrens. Es kann gleich oder weniger spezifisch, aber nicht spezifischer sein. – Corbin

+0

Es ist keine gültige Überschreibung von paintComponent, die JPanel als (Grafik g) auf seiner Methode angegeben hat? –

+1

Es gab tatsächlich eine Frage, die kürzlich ausführlich darüber gesprochen hat. Sehen Sie sich die Antworten auf http://stackoverflow.com/a/9950538/567864 an. Es sollte erklären, warum Sie gleich oder weniger spezifisch, aber nicht spezifischer sein können, wenn Sie eine Methode überschreiben. – Corbin

Antwort

1

Wenn Sie eine Methode überschreiben, können Sie grundsätzlich gleich oder weniger spezifisch sein.

Denken Sie darüber nach:

JPanel p = new MyPanel(); 
p.paintComponent(someGraphicsInstance); 

Ein Verweis auf eine JPanel erwartet wird, der Lage sein, eine Grafikreferenz als Parameter an die paintComponent Methode zu akzeptieren. Ihre Methode verletzt jedoch diese Anforderung, da sie keine Graphics Instanz akzeptiert, sondern nur eine Graphics2D.

Weitere Informationen dazu finden Sie https://stackoverflow.com/a/9950538/567864

2

Es besagt, dass Sie es auf diese Weise implementieren sollten, da Graphics2D Graphics ist, während Graphics2D Graphics nicht ist.

Wenn Sie Casting störend finden, können Sie immer Ihr eigenes zB erstellen. MyJPanel, das JPanel erweitert, definiert Ihre eigene Methode und Unterklasse in der Zukunft und überschreibt Ihre definierte Methode.

public class MyJPanel extends JPanel { 

    @Override 
    protected void paintComponent(Graphics g) { 
     paintComponent((Graphics2D) g); 
    } 

    protected void paintComponent(Graphics2D g) { 
    } 
} 
+0

Das liegt also daran, dass es von JPanel so definiert wurde? –

+0

Ja, wenn Sie Ihre Methode so definieren, wie Sie es jetzt tun - mit Graphics2D überfordern Sie es einfach, aber es wird nicht von Ihrem JPanel aufgerufen. – JMelnik

+1

Danke, das zusammen mit der Person räumte das Konzept ein bisschen mehr für mich auf. Wie immer, ihr Jungs rockt hier. :-D –

Verwandte Themen