paintComponent in Panel eines Borderlayouts hinzufügen

lela

Neues Mitglied
Hallo zusammen,
nachdem ich im Forum nichts finden konnte, was mir geholfen hat, nun die Frage an euch:
Ich habe zwei Klassen, die eine erzeugt die View, wobei für den Frame das Borderlayout gesetzt wird:
Java:
public class HilfsklasseDrawboard extends JFrame {
    @Serial
    private static final long serialVersionUID = 1L;

    private final DrawboardPlayerBoard drawboardplayerboard;

    public HilfsklasseDrawboard(){
        drawboardplayerboard = new DrawboardPlayerBoard();
    }
    
    public static void main(String[] args) {

        JFrame frame = new JFrame("BorderLayout");

        frame.setLayout(new BorderLayout());
        frame.setVisible(true);

        DrawboardPlayerBoard drawboardplayerboard = new DrawboardPlayerBoard();
        ...
        
        JPanel panelLeft = new JPanel();
        panelLeft.setSize(400,400);
        panelLeft.add(drawboardplayerboard);
        drawboardplayerboard.setVisible(true);
        ...
        Container c = frame.getContentPane();
        c.add(panelLeft, BorderLayout.WEST);
    }
}

In der Klasse DrawboardPlayerBoard wird nun die entsprechende Graphik gezeichnet, die in das linke Panel eingefügt werden soll:

Code:
public class DrawboardPlayerBoard extends JPanel {
    @Serial
    private static final long serialVersionUID = 1L;

    private Graphics2D g2D;

    public DrawboardPlayerBoard(){
    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g2D = (Graphics2D) g;
        g2D.setColor(Color.black);
        g2D.drawRect(160, 200, 40, 40);
        g2D.setColor(Color.gray);
        g2D.fillRect(160, 200, 40, 40);
    }
}


Was mich an der ganzen Sache wundert, ist dass tatsächlich was gezeichnet wird, aber egal, welchen Zeichenbefehl man gibt (Rechteck/Kreis, Farbe, Größe, ...), es erscheint immer nur ein kleines graues Quadrat. Deswegen bin ich etwas verwundert, weil die Zeichnung falsch übergeben wird.
Hat jemand schon mal ähnliche Erfahrungen gemacht? Ich bin langsam mit meinem Latein am Ende...
Vielen Dank schon mal für eure Ideen!
Liebe Grüße
Lela
 
Meine Vermutung:
Du setzt nur eine Größe bei panelLeft. Dein DrawboardPlayerBoard ist auch ein JPanel und da setzt Du keine Größe. Daher dürfte das Panel entsprechend Größe 0 haben oder so. Daher wird dies vermutlich nur so dargestellt.

Daher würde ich Dir empfehlen, da auch einmal eine Größe zu setzen. Also Größe und Position wären da das, was ich kontrollieren und setzen würde.
 
Vielen lieben Dank für die Antwort, das habe ich auch schon versucht.
Meiner Meinung müsste das ja dann eine Methode in meiner Draw-Klasse sein, die die Graphik überhaupt noch ins Panel einfügt, die so oder so ähnlich aussieht:
Java:
    public void draw(JPanel) {
        playerboardPanel.add(g2D);   
    }
Aber das funktioniert nicht, dass er auf "g2D" zugreift.
Teilweise habe ich auch das Gefühl, dass es Probleme gibt, das Gezeichnete in ein Panel einzufügen.
In einem vereinfachten Codegerüst klappt es nämlich, dass ich es einem frame hinzufüge mit der Methode getContentPane().
 
Vielen lieben Dank für die Antwort, das habe ich auch schon versucht.
Meiner Meinung müsste das ja dann eine Methode in meiner Draw-Klasse sein, die die Graphik überhaupt noch ins Panel einfügt, die so oder so ähnlich aussieht:
Java:
    public void draw(JPanel) {
        playerboardPanel.add(g2D);  
    }
Aber das funktioniert nicht, dass er auf "g2D" zugreift.
Teilweise habe ich auch das Gefühl, dass es Probleme gibt, das Gezeichnete in ein Panel einzufügen.
In einem vereinfachten Codegerüst klappt es nämlich, dass ich es einem frame hinzufüge mit der Methode getContentPane().
Deine Zeichenmethode in DrawboardPlayerBoard zeichnet genau das, was du siehst, das passt schon.
Wenn du was anderes zeichnen lassen willst, musst du es von der drawComponent Methode in DrawboardPlayerBoard aus aufrufen, dann kannst du auch dein g2d als Parameter weitergeben.

Um eine Grafik hinzuzufügen, brauchst du kein Graphics-Objeckt

Java:
void addImage(BufferedImage image, int x, int y) {
    this.imagesToDraw.add(...);
}

 protected void paintComponent(Graphics g){
        super.paintComponent(g);
        for (var whatever : imagesToDraw) {
            g.drawImage(...);
        }
}
Das Graphics-Objekt ist keine Eigenschaft der Komponente, sondern der Zeichenfläche, also des Bildschirms.

Ich weiß jetzt nicht, ob das auch auf dich zutrifft, aber ich hab gemerkt, dass es in den Köpfen einiger Leute noch nicht angekommen ist, dass die Grafik einer Komponente nicht irgendwo abgespeichert wird. Die Komponente wird bei jedem paingComponent() Aufruf neu gezeichnet! super.paintComponent() löscht erst mal alles raus, zeichnet Texte und Icons - sofern vorgesehen. Dann muss man noch hinzufügen, was man sonst noch haben will: jedes Mal, nicht nur einmal. D.h. fügt man eine Grafik hinzu, dann muss man die irgendwo als Icon oder Image hinterlegen, damit sie dann in der paint-Methode gezeichnet werden kann.
 

Zurück
Oben