# JPanel mit Null Layout entfernt Buttons



## Extremefall (3. Okt 2010)

Hallo,
ich habe momentan das Problem, dass die JButtons aus meinem JPanel verschwinden, wenn ich das Null Layout festlege. Ich habe noch keine Positions und Größeneinstellungen der JButtons vorgenommen. Vorher war das Panel so in der Art:


```
JPanel panel = new JPanel();
```

Layout wurde nicht mehr festgelegt. Wenn ich nun allerdings folgendes schreibe:


```
JPanel panel = new JPanel();
panel.setLayout(null);
```

dann werden alle Buttons nicht mehr angezeigt. Muss ich die Position erst festlegen etc? Wie kann ich das Problem lösen? Ps.: Das Panel liegt auf einem weiteren Panel.


----------



## eRaaaa (3. Okt 2010)

Extremefall hat gesagt.:


> Muss ich die Position erst festlegen etc? Wie kann ich das Problem lösen?



Jopp, entweder mit setBounds oder setSize+setLocation. Oder noch besser: verwende doch lieber einen Layoutmanager


----------



## SlaterB (3. Okt 2010)

ähm, ja, wenn man im Winter rausgeht ist es meistens kalt,

wieso verwendest du einen Befehl wie setLayout(null) wenn du die Konsequenzen nicht kennst?
es gibt Tutorials mit allen Einzelheiten dazu
Doing Without a Layout Manager (Absolute Positioning) (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)


----------



## Extremefall (3. Okt 2010)

Die Buttons sollen aber eine bestimmte Größe haben und das ist ja mit vielen LayoutManagern nicht möglich zu bewerkstelligen oder? setBounds bewirkt leider nichts mit den Wert (0,0,20,20). Das gleiche ist es bei setSize(30,30);

Edit: Fehlte einfach das Repaint? Funktioniert so jedenfalls immer noch nicht:


```
jbutton.setBounds(0,0,10,10);
jbutton.repaint();
```


----------



## SlaterB (3. Okt 2010)

ein repaint() ist nicht nötig, andere Fehlerursachen anhand deines nicht vorhanden Codes:
- jbutton ist nicht im Panel drin,
- Panel selber nicht in der GUI oder mit zu wenig Platz
- falls erst zur Laufzeit nach setVisible(true) am besten validate() + repaint() am JFrame aufrufen
- 0,0,10,10 ist auch arg knapp, im Extremfall vielleicht unter der Titelleiste verborgen, fang mal mit 50x50 an
- ?

-> immer vollständiges Mini-Testprogramm posten


----------



## Extremefall (3. Okt 2010)

Es funktioniert leider immer noch nicht. Hier mein Code:

```
// Problem hat sich gelöst. Vielen Dank
```

Ps.: Deswegen wollte ich nicht das komplexe Programm gleich posten.


----------



## SlaterB (3. Okt 2010)

kurzes Testprogramm nicht verstanden? nur EIN Button bitte,

> Deswegen wollte ich nicht das komplexe Programm gleich posten. 
keiner sagt, dass du nicht dein Programm eine Stunde lang umschreiben darfst 

dazu: weder 'jbutton'  noch 'setBounds(0,0,10,10)' sind in deinem Code enthalten

--------

in grenzenloser Selbstaufgabe habe ich aber dann doch versucht, den Weg von redbuttonjbutton zu verfolgen,
der landet in buttonspanel und buttonspanel mit null-Layout in headline mit BorderLayout.WEST;

BorderLayout kennst sicher auch nicht, das versucht den CENTER-Bereich so groß wie möglich zu machen, alles andere wird so weit minimiert wie möglich,
da buttonspanel kein automatisches Layout hat, wird es mit Größe 0x0 angenommen, ist also nicht zu sehen, egal wie dessen Inhalt absolut positioniert ist, das wird nicht automatisch berücksichtigt,

Reihenfolge der Aufgaben beachten:
bevor du an irgendwelche Buttons in buttonspanel einfügst, überzeuge dich doch erst, dass buttonspanel einigermaßen ordentlich funktioniert,
setSize() dürfte helfen, 
und setze eine Hintergrundfarbe oder einen Border/ Rahmen, um zu sehen was das Panel so macht


----------



## eRaaaa (3. Okt 2010)

redbuttonjbutton.setBounds(0, 0, 30, 30);
danach kommt nochmal
redbuttonjbutton.setSize(20, 20);

entscheide dich....

Und schau dir mal an, wie groß das Panel "buttonspanel" bei dir ist! Wie soll da der Button angezeigt werden....


----------



## Extremefall (3. Okt 2010)

Das mit dem Center wusste ich nicht. Also einfach jetzt dem buttonpanel eine Größte mitgeben? Ok, danke für die Info. Leider funktioniert es noch nicht, wenn ich das Panel mit setSize(100,100) setze. Das Panel sieht man nicht, also auch nicht den Rahmen etc.


----------



## eRaaaa (3. Okt 2010)

[c]buttonspanel.setPreferredSize[/c] evtl.? :autsch:


----------



## Extremefall (3. Okt 2010)

Nur mal eine Frage: Wieso funktioniert setSize nicht, da es ja auch in der API unter den geerbten Klassen als Methode aufgelistet ist?


----------



## SlaterB (3. Okt 2010)

so ist Swing, eine Ansammlung von Dingen wie verschiedenen Layouts, die miteinander funktionieren sollen, aber nicht perfekt abgestimmt sind,

headline in ein vorgegebenes Layout, das schaut sie die gesetzte preferredSize an, errechnet daraus die gelayoutete Size, setzt diese wieder und am Ende wird so gemalt,

buttonspanel.setSize(300) -> BorderLayout sieht preferredSize 0, errechnet Size 0, ganz egal was manuell gesetzt wurde,
buttonspanel.setPreferredSize(300) -> BorderLayout sieht preferredSize 300, errechnet Size 300 oder ähnlich 

buttonspanel hat dagegen das null-Layout, für die Buttons darin ist setSize() verbindlich, 
und der andere Wert setPreferredSize() sinnlos, denn kein Layout schaut sich diesen Wert an um die richtige Size zu errechnen und zu setzen

------

headline selber ist bei dir übrigens auch wieder nur im NORTH-Bereich eines anderen Panels drin, 
zum Glück wird die preferredSize von buttonsPanel durchgereicht, das title-JLabel hilft auch, sonst eine Stufe mehr die zu beachten ist


----------

