2010-02-03 8 views
17

Hi Używam BoxLayout stos JPanel s na szczycie siebie (BoxLayout.Y_AXIS), na przykład, czy mój rodzic JPanel ma wysokość 500 pikseli i dodaję dwa panele podrzędne do niego zarówno z wysokość 100 pikseli. BoxLayout rozciąga je tak, że razem zajmują przestrzeń 500px. Czy ktoś wie, jak wyłączyć tę funkcję?BoxLayout rozciąga komponent dopasować panel rodzic

+0

Jak ty sepcifying rozmiaru paneli podrzędnych? – Ascalonian

+0

Z panel.setPrefferedSize i panel.setMinimumSize oba przy użyciu tego samego wymiaru – Aly

Odpowiedz

10

Zamiast tego użyj GridBagLayout. Masz większą kontrolę nad swoim interfejsem użytkownika.

Ale jeśli chcesz nadal używać BoxLayout i nie chcesz, aby się rozciągały, możesz sprawdzić, używając invisible component fillers jak sztywne obszary, klej i wypełniacze.

+3

Jeśli nie chcesz głosować na mnie, podaj przyczynę – Ascalonian

+0

Pamiętaj, aby zapoznać się z sekcją "Poziomy klej" w opublikowanym linku. Bardzo pomocne. – FuriousFolder

3

Twoje panele się rozciągają, ponieważ BoxLayout nie ogranicza każdego panelu do jego preferowanego rozmiaru. Musisz znaleźć układy, które są zgodne z preferowanym rozmiarem komponentu, jak to ma miejsce w pozycjach NORTH i SOUTH w BorderLayout.

Spróbuj tego:

  1. Tworzenie JPanel z BorderLayout. Dodaj element potomny jako PÓŁNOCNY w tym JPanelu.
  2. Utwórz drugi JPanel dla drugiego komponentu potomnego, dodaj go jako PÓŁNIEJ z BorderLayout
  3. Dodaj dwa JPanele do swojej BoxLayout.

Kod:

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

Podoba mi się to rozwiązanie, ponieważ pozwala uniknąć bałaganu z siatką i modyfikowania samych elementów, co jest ogromnym plusem. –

1

Sztuką jest, jak poprzednia odpowiedź wspomniano, użycie kleju, wypełniacze i obszary sztywne w układzie pudełko. Jednak w odróżnieniu od tego, który odpowiada, polecam trzymać się z BoxLayout - w przypadku Boxa można łatwiej wykonywać najprostsze interfejsy niż w przypadku Grid Bag; a dodatkowa moc nie kupuje zbyt wiele w typowym oknie dialogowym.

W starym idiomie były takie rzeczy jak Box.createHorizontalStrut (int x) i Box.createHorizontalGlue(); chodzi o to, że umieszczasz rozpórkę między pierwszym i drugim komponentem, a następnie dodajesz klej po drugim. ("strut" = "sztywny obszar" w dzisiejszych czasach).

+0

Zgadzam się z tym dla ogólnych celów układania GridBagLayout może być przesadą. Sugeruję to, jeśli pójdzie do przodu. – Ascalonian

+0

Próbowałem umieścić sztywny obszar między dwoma panelami dla dzieci i klejem pionowym po drugim, położyć panele są nadal rozciągnięte: s – Aly

+0

Nie ma czegoś takiego jak przesada :) – willcodejavaforfood

20

BoxLayout jest jednym z niewielu menedżerów układów, które respektują minimalne i maksymalne rozmiary komponentu. Więc jeśli chcesz zapobiec rozciągnięciu panelu, możesz użyć:

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

To mogło być jakiś czas temu, ale czy używasz nadpisanej metody getPreferredSize()? – MikeM

+0

@MikeM, nie, ponieważ panel powołuje się na menedżera układu, aby zwrócić preferowany rozmiar. Właściwie lepszym rozwiązaniem jest rozszerzenie JPanel i nadpisanie metody 'getMaximumSize()' w celu prostego zwrócenia wartości z metody 'getPreferredSize()'. W ten sposób maksymalny rozmiar zostanie obliczony dynamicznie w przypadku, gdy preferowany rozmiar zmienia się dynamicznie. – camickr

+0

Interesujące, dzięki. – MikeM

2

To wydaje się działać idealnie dobrze ... używając BoxLayout, jak chciałeś.

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);