(Anfängerhilfe) awt.Graphics Schwierigkeiten

Azazel

Mitglied
Moin,

Ich wage mich jetzt endlich an das Java Komponent JPanel und möchte darauf etwas zeichnen.
Da JPanel Objekte keine Methoden zur Graphischen darstellung besitzen, muss ich mit der Graphics Klasse arbeiten(habe ich so verstanden).
Die Graphics Klasse ist aber abstract und ich kann kein Objekt davon erzeugen und es besitzt keine Methoden zum Zeichnen richtig?
Ich weis auch nicht, welche Klassen von Graphics erben 🙁

So habe ich mal angefangen:
Java:
public class Startklasse{
   
    public static void main(String[] args){
       
    new Fenster();
    }
}
Java:
import javax.swing.JFrame;

public class Fenster extends JFrame{
    private static final long serialVersionUID = 1l;

    public static final int WIDTH = 300, HEIGHT = 400;
   
    public Fenster(){
       
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(new Leinwand());
       
        setVisible(true);
    }
}
Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Leinwand extends JPanel {
private static final long serialVersionUID = 1L;

    public Leinwand(){
        paintX();
       
    }
   
    void paintX(){
        Graphics g = this.getGraphics();
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, 100, 100);
       
    }
}
Leider bekomme ich da gleich mehrere Fehlermeldungen, welche das sind solltet ihr hoffentlich wissen.

Kann mir jemand auf einfache Weise erklären, wie das System mit den Zeichnen auf einen JPanel funktioniert?

Danke
 
Um in einer JComponent Klasse zeichnen zu können muss man dessen paintComponent Methode überschreiben. Diese wird vom Framework aufgerufen und bringt gleich das korrekte Graphics Objekt mit:
Code:
@Override
protected void paintComponent(Graphics g)
{
	g.drawXXX(); //drawString() drawOval() etc
}

Hinweis: So wird nichts gezeichnet außer dem was man selbst programmiert. Wenn man eine Komponente nur mit zustätzlichen Sachen verschönern will, muss man als erstes
super.paintComponent(g); aufrufen bevor man die eigenen Zeichnen Anweisungen gibt.

Code:
@Override
protected void paintComponent(Graphics g)
{
	super.paintComponent(g);
	g.drawXXX(); //drawString() drawOval() etc
}
 
Danke X5-599,
Aber 2 Fragen habe ich noch,

1. Wieso wird bei mir die paintComponent() Methode aufgerufen, obwohl ich das im Leinwand Konstruktor nicht eingegeben habe? Ich müsste im Konstruktor Theoretisch noch: paintComponent(); ergänzen.

2. Wieso muss ich diese Methode auf Protected Kapseln, reicht es nicht, wenn ich es auf default setze ?
 
Man muss (und sollte wohl auch) die paintComponent Methode nicht selbst aufrufen, weil das vom Swing Framework erledigt wird. Indem man diese Methode überschreibt greift man quasi in den Zeichen Prozess ein. Pure Vererbungslogik. Das Framework will bei allen seinen Objekten diese Methode aufrufen damit sie sich zeichnen. Jede Klasse (JPanel, JButton, JFrame etc) hat seine eigene Vorstellung davon wie sie gezeichnet werden soll. d.h. die paintComponent Methode sieht in jeder dieser Klassen unterschiedlich aus.

Habe ich nun eine Klasse die von einer dieser Klassen erbt, wird sie erstmal so aussehen wie diese. Überschreibe ich allerdings die paintComponent Methode und lasse sie z.B. leer. Dann ruft das Framework bei meiner neuen Klasse ebenfalls diese Methode auf. Da sie aber leer ist gibt es dementsprechend nichts zu zeichnen. Meine Klasse würde in einer GUI also nicht dargestellt. Das Framework kann die Komponente auch nicht so zeichnen wie ursprünglich definiert (in den paintComponent Methode der Oberklasse), weil dafür eine explizite Anweisung fehlt. Das ist der Aufruf: super.paintComponent.

Das protected kommt daher, dass diese Methode nunmal so in der JComponent Klasse (Die Oberklasse für sowas wie JPanel, JButton etc) definiert ist. Man darf diese Sichtbarbeit erweitern, aber nicht verringern. Du könntest zb auch
Code:
@Override
public void paintComonent(Graphics g)
schreiben.
Code:
@Override
private void paintComponent(Graphics g)
void paintComponent(Graphics g)
hingegen ginge nicht.

Es macht allerdings nicht viel Sinn public statt protected zu schreiben, da man ja diese paintComponent Methode nicht selbst aufruft. Ob man nun public oder protected schreibt muss jeder selber wissen. Ich bin mir sicher schon beides in freier Wildbahn gesehen zu haben.
Persönlich änder ich die Sichtbarkeit von überschriebenen Methoden nicht. Es könnte Sinn machen bei Methoden, die man auch selbst aufruft aber ich habe es bisher noch nie machen müssen.
 

Zurück
Oben