2010-02-03 4 views
17

Hallo paßt ich BoxLayout bin mit JPanel s auf dem jeweils anderen (BoxLayout.Y_AXIS) zu stapeln, zum Beispiel, wenn meine Eltern JPanel von 500 Pixeln Höhe sind und ich füge hinzu Kind zwei Platten, um es sowohl von Höhe 100 Pixel. Die BoxLayout streckt sie so, dass sie zusammen den 500px Platz einnehmen. Kann jemand diese Funktion deaktivieren?BoxLayout erstreckt Komponente Mutterplatte

+0

Wie sepcifying Sie die Größe des Kind-Panels? – Ascalonian

+0

Mit panel.setPrefferedSize und panel.setMinimumSize beide mit der gleichen Dimension – Aly

Antwort

10

Verwenden Sie stattdessen GridBagLayout. Sie haben viel mehr Kontrolle über Ihre Benutzeroberfläche.

Aber wenn Sie BoxLayout immer noch verwenden möchten, und sie nicht dehnen möchten, können Sie mit invisible component fillers wie starren Bereichen, Kleber und Füllstoffe auschecken.

+3

Wenn Sie mich abstimmen, geben Sie bitte einen Grund – Ascalonian

+0

Achten Sie darauf, den Abschnitt "Horizontalkleber" in den Link gebucht. Sehr hilfreich. – FuriousFolder

3

Ihre Panels dehnen sich aus, da BoxLayout nicht jedes Panel auf seine bevorzugte Größe einschränkt. Sie müssen Layouts finden, die die bevorzugte Größe einer Komponente berücksichtigen, wie dies BorderLayouts NORTH- und SOUTH-Positionen tun.

Try this:

  1. erstellen JPanel mit einem Border. Fügen Sie in diesem JPanel Ihre untergeordnete Komponente als NORTH hinzu.
  2. Erstellen Sie ein zweites JPanel für die andere untergeordnete Komponente, fügen Sie es als NORD eines BorderLayouts hinzu
  3. Fügen Sie die zwei JPanels zu Ihrem BoxLayout hinzu.

Code:

JPanel panel1 = new JPanel(new BorderLayout()); 
panel1.add(component1, BorderLayout.NORTH); 
JPanel panel2 = new JPanel(new BorderLayout()); 
panel2.add(component2, BorderLayout.NORTH); 

JPanel boxPanel = new JPanel(); 
BoxLayout boxLayout = new BoxLayout(boxPanel, BoxLayout.Y_AXIS); 
boxPanel.setLayout(boxLayout); 
boxPanel.add(panel1); 
boxPanel.add(panel2); 
+1

Ich mag diese Lösung, weil sie es vermeidet, mit dem Gridbag zu spielen und die Komponenten selbst zu modifizieren, was beides ein großes Plus ist. –

1

Der Trick ist, als die vorherige Antwort erwähnt, den Kleber zu verwenden, Füllstoffe und starre Bereiche in dem Box-Layout. Im Gegensatz zu diesem Responder würde ich jedoch empfehlen, bei BoxLayout zu bleiben - Sie können einfachere UIs einfacher mit Box ausführen als mit der Grid Bag; und die zusätzliche Leistung kostet Sie nicht viel in Ihrem typischen Dialogfeld.

Im alten Idiom waren dies Dinge wie Box.createHorizontalStrut (int x) und Box.createHorizontalGlue(); Die Idee ist, dass Sie eine Strebe zwischen Ihre erste und zweite Komponente legen und dann einen Kleber nach der zweiten hinzufügen. ("Strut" = "starre Fläche" heutzutage).

+0

Ich stimme damit überein, dass das GridBagLayout für allgemeine Stacking-Zwecke übertrieben ist. Ich schlage es nur vor, wenn er vorwärts geht. – Ascalonian

+0

Ich habe versucht, eine starre Fläche zwischen den beiden Kinderverkleidungen und vertikale Kleber nach der zweiten, setzen Sie die Platten sind immer noch gestreckt: s – Aly

+0

Es gibt keine so etwas wie ein Overkill :) – willcodejavaforfood

20

BoxLayout ist einer der wenigen Layout-Manager, der die minimalen und maximalen Größen einer Komponente berücksichtigt. Also, wenn Sie von einer Platte verhindern, wollen Strecken Sie verwenden können:

panel.setMaximumSize(panel.getPreferredSize()); 
+0

Das mag schon eine Weile her sein, aber benutzt das eine überschriebene getPreferredSize() Methode? – MikeM

+0

@MikeM, nein, da das Panel darauf angewiesen ist, dass der Layout-Manager die bevorzugte Größe zurückgibt. Tatsächlich ist eine bessere Lösung, das JPanel zu erweitern und die 'getMaximumSize()' Methode zu überschreiben, um einfach den Wert von der 'getPreferredSize()' Methode zurückzugeben. Auf diese Weise wird die maximale Größe dynamisch berechnet, falls sich die bevorzugte Größe dynamisch ändert. – camickr

+0

Interessant, danke. – MikeM

2

Dies scheint völlig in Ordnung zu arbeiten ... BoxLayout verwenden, wie man wollte.

test

this.setLayout(new FlowLayout()); // this being the JFrame 

    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
    panel.setPreferredSize(new Dimension(500, 500)); 
    panel.setBackground(Color.orange); 
    this.add(panel); // add the parent to the JFrame 

    JPanel pnlChild1 = new JPanel(); 
    pnlChild1.setBackground(Color.cyan); 
    pnlChild1.setMaximumSize(new Dimension(200, 100)); 

    JPanel pnlChild2 = new JPanel(); 
    pnlChild2.setBackground(Color.magenta); 
    pnlChild2.setMaximumSize(new Dimension(200, 100)); 

    panel.add(pnlChild1); 
    panel.add(pnlChild2);