Selbstgezeichnete JComponents

Status
Nicht offen für weitere Antworten.

peez

Bekanntes Mitglied
Ich möchte eine Art "Zeichenbrett" auf dem Elemente positioniert werden realisieren.

Dazu habe ich einfach das Zeichenbrett von JComponent abgeleitet:
Java:
public class Zeichenbrett extends JComponent {
  //...
  public void paint(Graphics g) {
    g.setColor(Color.WHITE);
    g.fillRect(0,0,getWidth(), getHeight()); //Zeichnet irgendwas

    super.paint(g);
  }
}

Und die Klasse Element genau so:
Java:
public class Element extends JComponent {
  //...
  public void paint(Graphics g) {
    g.setColor(Color.RED);
    g.fillRect(0,0,getWidth(),getHeight());

    super.paint(g);
  }
}

Jetzt dachte ich, da beides von JComponent abgeleitet ist, füge ich einfach die Elemente zum Zeichenbrett hinzu:
Java:
Zeichenbrett zeichenbrett = new Zeichenbrett();
zeichenbrett.setBounds(0,0,500,500);

Element e1 = new Element();
e1.setBounds(10,10,200,200);
zeichenbrett.add(e1);

Müsste jetzt nicht durch super.paint() in der Zeichenbrett Klasse automatisch paint() von der Element Klasse aufgerufen werden?
Leider wird sie überhaupt nicht aufgerufen.
Wenn ich zeichenbrett einen Layoutmanager zuweise, wird paint() von Element wenigstens aufgerufen aber auf dem Bildschirm erscheint leider trotzdem nichts vom Element.
Habe ich da irgendwo einen Denkfehler?
 

peez

Bekanntes Mitglied
Uups peinlich.

Bitte ignoriert den Beitrag.

Mein Component hatte eine Größe von 0,0... Dann wird er natürlich nicht gezeichnet ;-)
 

André Uhres

Top Contributor
Im vorliegenden Fall brauchst du dann keinen super Aufruf. Siehe auch Malen in Swing Teil 1: der grundlegende Mechanismus - Byte-Welt Wiki
Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.*;
public class PaintDemo extends JFrame {
    public PaintDemo() {
        super("PaintDemo");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        Zeichenbrett zeichenbrett = new Zeichenbrett();
        Element e1 = new Element();
        e1.setBounds(10, 10, 200, 200);
        zeichenbrett.add(e1);
        add(zeichenbrett);
    }
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
            public void run() {
                new PaintDemo().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
class Zeichenbrett extends JComponent {
    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.YELLOW);
        g.fillRect(0, 0, getWidth(), getHeight());
    }
}
class Element extends JComponent {
    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.RED);
        g.fillRect(0, 0, getWidth(), getHeight());
    }
}
 

MrGe

Mitglied
@peez
Vielleicht hilft dir der thread:
"getWidth(); getHeight(); außerhalb von paintComponent"
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben