GridbagLayout Problem - Panel bleibt immer gleich groß...
-
Ich habe einen MainFrame - dieser enthällt ein content JPanel (BackgroundColor = BLUE)
In das content JPanel packe ich per GridbagLayout ein weiteres JPanel (GamePanel) (BackgroundColor = RED)
GridBagConstraints c = new GridBagConstraints(); c.gridx = 0; c.gridy = 0; //c.anchor = GridBagConstraints.BASELINE; c.fill = GridBagConstraints.BOTH; c.weightx = GridBagConstraints.RELATIVE; c.weighty = GridBagConstraints.RELATIVE; c.weightx = 0; c.weighty = 0;
Alles was ich möchte ist das das GamePanel immer so groß ist wie das content JPanel - sprich beim vergrößern und verkleinern die Größe angepasst wird...
Nun nahm ich an das die "fill" Constraint genau dafür zuständig ist - aber offenbar sorgt die nur für unendlich große weiße flächen - super sinnvoll ... und auch nur wenn man die weight auf 1 setzt ? WIESO ?
c.weightx = 1; c.weighty = 1;
Beispiel:
http://img43.imageshack.us/i/arghi.jpg/ich hab mich da jetzt 3 stunden mit befasst - ich checks nicht ...
Wie erreiche ich mein Ziel ? Muss ich nen Listener benutzen und die Panel size beim resizen immer neu setzen ? Sowas sollten doch Layouts für mich machen können?
-
ist das bild mit dem monitor der game panel? Sieht man doch auch im 1. bild dass das panel keinen roten hintergrund hat, also ist das ergebnis im 2. bild doch korrekt!?
warum benutzt du außerdem kein borderlayout? ist doch genau für den anwendungsfall geschaffen.
-
Ach ich hab alle Layouts durch - funktionieren alle gleich gut ...
Das Ding in der Mitte ist das GamePanel korrekt - man sieht nen kleinen rotstich rechts vom karierten Feld ... der Rest des Panels ist weiß weil ich auch darin das Gridbag Layout verwende ...
-
ok, hab das Borderlayout nochmal probiert - da sich optisch nicht viel verändert hat habe ich dann anstelle des GamePanels mal ein Button genommen - der hat dann die ganze Fläche eingenommen.
Was muss ich also mit dem GamePanel machen damit es automatisch die richtige größe annimmt ?
public class GamePanel extends JPanel{ public GamePanel() { this.add(new JButton("foo")); this.setVisible(true); } }
Das reicht um wieder das selbe "falsche" Verhalten zu bekommen - was genau muss ich also am GamePanel noch tun damit es sich wie ein Button verhält - in kombination mit einem Border Layout oder Gridbag Layout ??
-
das klappt mit deinem game panel natürlich genauso wie mit dem button da brauchst du nichts ändern :?.
Dein letztes beispiel funktioniert nicht weil das gamepanel selber natürlich wieder flowlayout hat und der button deswegen normale größe hat. gib dem gamepanel auch nochmal borderlayout dann ist dein button wieder groß
-
danke!
- habs jetzt auch mitm Gridbag Layout hinbekommen ... war wohl ein Logikproblem - in ein "custom" JPanel nochmal ein content JPanel zu packen macht die ganze Sache dann irgendwann sehr undurchsichtig
-
Ich empfehle jedem sich das TableLayout anzuschauen. Es kann alles, was das GridBagLayout kann, nur sehr viel einfacher. Ein Nachteil ist nur, dass das TableLayout nicht in der JavaSE ist, sondern eine externe Bibliothek.