2012-03-02 7 views
5

Mam średni-duży interfejs użytkownika, który używa BorderLayout; Środek jest panelem z zakładkami, zawierającym różne panele o różnych układach, itp.Zachowanie preferowanych rozmiarów komponentów w środku BorderLayout

Chcę, aby panel w środku tego układu krawędzi zmieniał rozmiar w zależności od rozmiaru okna, ale nie chcę, aby komponenty w nim panel do rozciągnięcia. Etykiety, pola kombi, pola tekstowe, przyciski - chcę, aby pozostały w preferowanych rozmiarach i pozwoliłyby rozciągnąć panel, który je zawiera. Umieszczam je w panelu przewijania w przypadku, gdy przestrzeń jest zbyt mała dla panelu.

Różne plakaty z kolorowymi słownictwami ostrzegają przed niebezpieczeństwem użycia dowolnej metody setXXXsize() na komponentach. Właśnie to robię teraz i chciałbym się nauczyć, jak tego uniknąć.

GridBagLayout nie jest odpowiedni dla niektórych z moich paneli. Z natury jest zorientowany na rzędy i kolumny, a nie wszystko pasuje do rzędów i kolumn. Oczywiście mógłbym stworzyć sztuczne rzędy i kolumny, aby dopasować wszystko, ale mam nadzieję, że Swing ma więcej opcji układu niż to.

Klej pionowy też tego nie robi. Podaję je w HFOE ukochanego SSCE:

package example; 

    import java.awt.BorderLayout; 

    import javax.swing.Box; 
    import javax.swing.BoxLayout; 
    import javax.swing.JComboBox; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 

    public class BorderAndBox extends JFrame 
    { 
     public static void main(String args[]) 
     { 
      BorderAndBox bnb = new BorderAndBox(); 
      bnb.createUI(); 
      bnb.setVisible(true); 
     } 

     public void createUI() 
     { 
      JPanel borderPanel = new JPanel(new BorderLayout()); 

      JLabel northLabel = new JLabel("Nawth"); 
      borderPanel.add(northLabel, BorderLayout.NORTH); 

      String[] southComboChoices = { "one", "two", "three" }; 
      JComboBox southCombo = new JComboBox(southComboChoices); 
      borderPanel.add(southCombo, BorderLayout.SOUTH); 

      JPanel centerPanel = new JPanel(); 
      centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS)); 
      String[] firstChoices = { "first", "uno", "UN" }; 
      String[] secondChoices = { "second", "dos", "zwei" }; 
      String[] thirdChoices = { "third", "tres", "drei" }; 
      JComboBox firstCombo = new JComboBox(firstChoices); 
      JComboBox secondCombo = new JComboBox(secondChoices); 
      JComboBox thirdCombo = new JComboBox(thirdChoices); 
      centerPanel.add(firstCombo); 
      centerPanel.add(secondCombo); 
      centerPanel.add(thirdCombo); 
      centerPanel.add(Box.createVerticalGlue()); // first attempt; does NOT 
      // take up available vertical space, instead it appears to create a space 
      // that is shared equally among the (now) four components of this space. 
      borderPanel.add(centerPanel, BorderLayout.CENTER); 

      getContentPane().add(borderPanel); 
      pack(); 
     } 

    } 

Jeśli powiększyć okno, comboboxes w centrum powiększyć; jak napisano, pionowy kawałek kleju pod nimi również się powiększa, ale nie zajmuje całej dostępnej przestrzeni. Wygląda na to, że otrzymuje tyle miejsca, ile każdy z nich.

Jaki jest dobry sposób podejścia do tego?

+0

* ".. ukochana SSCE:" * Ja też to kocham. I to jest SSCCE (2 Cs). ;) –

+0

to nie może być tylko mały samodzielny przykład? – arcy

+0

* "to nie może być tylko mały, samodzielny przykład?" * [Cytując] (http://sscce.org/#co) jeden z moich ulubionych ludzi: * "W tym dokumencie poprawne (lub możliwe do kompilacji, co w szczególności odnosi się do kodu źródłowego komputera) oznacza zapewnienie, że twój przykład pasuje do zaakceptowanych standardów i protokołów. "* najbardziej znaczący podpunkt *" Upewnij się, że twój przykład jest poprawny. Albo przykład kompiluje się czysto, albo pojawia się dokładny komunikat o błędzie, potrzebujesz pomocy. "* Kod skompilowany i pokazany problem, łatwe do zrobienia. To * jest * SSCCE. :) –

Odpowiedz

10

BorderAndBox - centered

import java.awt.BorderLayout; 
import java.awt.GridBagLayout; 

import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class BorderAndBox extends JFrame 
{ 
public static void main(String args[]) 
{ 
    BorderAndBox bnb = new BorderAndBox(); 
    bnb.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    bnb.createUI(); 
    bnb.setVisible(true); 
} 

public void createUI() 
{ 
    JPanel borderPanel = new JPanel(new BorderLayout()); 

    JLabel northLabel = new JLabel("Nawth"); 
    borderPanel.add(northLabel, BorderLayout.NORTH); 

    String[] southComboChoices = { "one", "two", "three" }; 
    JComboBox southCombo = new JComboBox(southComboChoices); 
    borderPanel.add(southCombo, BorderLayout.SOUTH); 

    JPanel centerPanel = new JPanel(); 
    centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS)); 
    String[] firstChoices = { "first", "uno", "UN" }; 
    String[] secondChoices = { "second", "dos", "zwei" }; 
    String[] thirdChoices = { "third", "tres", "drei" }; 
    JComboBox firstCombo = new JComboBox(firstChoices); 
    JComboBox secondCombo = new JComboBox(secondChoices); 
    JComboBox thirdCombo = new JComboBox(thirdChoices); 
    centerPanel.add(firstCombo); 
    centerPanel.add(secondCombo); 
    centerPanel.add(thirdCombo); 
    centerPanel.add(Box.createVerticalGlue()); // first attempt; does NOT 
    // take up available vertical space, instead it appears to create a space 
    // that is shared equally among the (now) four components of this space. 
    JPanel centerPanelConstrain = new JPanel(new GridBagLayout()); 
    centerPanelConstrain.add(centerPanel); 
    borderPanel.add(centerPanelConstrain, BorderLayout.CENTER); 

    getContentPane().add(borderPanel); 
    pack(); 
} 

} 

Zobacz także this answer. Istnieje więcej niż jeden sposób rozwiązania tego problemu.

+0

To urocza sztuczka; Zakładam, że mogę grać z GridBagLayout z mojego pojedynczego komponentu, aby go pojawił się w lewym górnym rogu, tak jak bym chciał. Czy chciałbyś wyjaśnić, dlaczego to działa? – arcy

+0

* "Czy chcesz wyjaśnić, dlaczego to działa?"* Pojedynczy komponent dodany do GBL bez ograniczenia, kończy się na środku.Jak jakakolwiek inna pozycja, nie jestem pewien.Zapewniam tylko GBL do centrowania pojedynczych komponentów, a raz dawno temu na okresowy stół (aranżacja każdy element) Dzisiaj prawdopodobnie zrobiłbym to drugie używając 'GroupPlayout' Nie jestem ekspertem od GBL –

+0

GroupPlayout? LOL, +1 chociaż, ja też miałem zamiar opublikować tę samą logikę, ale wydaje się, że jestem zbyt zbyt późno –

-1

Polecam używasz JPanel z javax.swing.GroupLayout. Jednak nie jest łatwo użyć tego układu, kodując go. Użyj generatorów kodu, takich jak Netbeans Matisse Builder, i skopiuj je tam, gdzie chcesz, jeśli nie chcesz używać IDE.

+1

GroupLayout, podobnie jak GridBagLayout, to wszystko na temat wierszy i kolumn; Mogę ewentualnie użyć GroupLayout w taki sam sposób, w jaki Pan Thompson pokazał mi GridBagLayout, zobaczę, czy łatwiej jest umieścić go w lewym górnym rogu, jak chcę. Ale myślę, że zarówno układy grupowe, jak i GridBag są kiepskimi wyborami dla paneli z wieloma komponentami, ale bez wyglądu wiersza/kolumny. – arcy

Powiązane problemy