# Eigene JComponent



## Tente (6. Mai 2010)

Hallo zusammen,

ich wollte mich mal in die Implementierung von eigenen Komponenten reinarbeiten. Einfach nur mal schnuppern. Ich habe mir dazu ein GUI geschrieben. In diesem GUI existiert natürlich ein JPanel.
Außerdem habe ich mir eine Klasse geschrieben, die von JComponent erbt und dort die Methode "paintComponent" überschrieben. Die Klasse soll bis jetzt einfach nur ein Rechteck zeichnen.


```
public class RectComp extends JComponent {

  public RectComp(){
  }

  @Override
  protected void paintComponent(Graphics g) {
     super.paintComponent(g);
     g.drawRect(10, 10, 200, 100);
  }

}
```

Das ist also meine Rechteck-Komponente... Nun will ich diese Rechteck-Komponente in das JPanel packen. Dazu rufe ich in meiner JPanel-Klasse die add-Methode auf.


```
this.add(new RectComp());
```

Wenn ich nun das Programm ausführe, wird jedoch kein Rechteck gezeichnet. Auch wenn ich einen LayoutManager benutze ändert sich nichts. Es wird also kein "RectComp" dargestellt.
Hat jemand eine Idee, wieso nichts gezeichnet wird? Wenn ich das Rechteck direkt in meiner JPanel-Klasse in der Methode "paintComponent" zeichne, funktioniert es einwandfrei. Möchte aber gerne eine eigene JComponent-Klasse für das Rechteck.

Wäre für Eure Hilfe dankbar!

Gruß,
Tente


----------



## KrokoDiehl (6. Mai 2010)

Ich vermute stark, dass es an der Größe der Komponente liegt. Du solltest noch 
	
	
	
	





```
getPreferredSize()
```
überschrieben, denn daran halten sich die meisten _LayoutManager_. Vermutlich hat deine Komponente, weil sie quasi leer ist, einfach die Größe (0; 0).


----------



## SlaterB (6. Mai 2010)

auch mal zu spät:

kommt auf das Layout an, wenn du die Komponente direkt in ein JFrame einfügst, welches standardmäßig BorderLayout hat,
dann bekommt die Komponente den ganzen Platz:

```
public class TestGUI extends JFrame {
    public TestGUI(){
        add(new RectComp());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 200);
        setVisible(true);
    }

    public static void main(String[] args) {
        new TestGUI();
    }
}

class RectComp extends JComponent {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawRect(10, 10, 200, 100);
    }
}
```

bei allen anderen Layouts ist die Rückgabe von getPreferredSize() wichtig,
bei einem eigenen JPanel, welches nur malt, übrigens ganz genauso


----------



## Tente (6. Mai 2010)

Find ich geil!  Wenn ich getPreferredSize überschreibe funktioniert es 
Danke Leute!


----------



## SlaterB (6. Mai 2010)

überschreiben ist vielleicht übertrieben, 
wenn die Oberklasse nun auch schon einen setter hat und das Attribut gut merken kann, 
reicht bestimmt einmalig setPreferredSize() aufzurufen


----------

