2010-03-11 5 views
6

Mam JPanel, który używa BoxLayout w kierunku X_AXIS. Problem, który mam najlepiej obrazuje najlepiej: alt text http://www.freeimagehosting.net/uploads/fbffd71119.pngDokonywanie BoxLayout przenieść komponenty na górę podczas układania od lewej do prawej

Jak widać JPanel po lewej stronie został wyśrodkowany zamiast wyrównany u góry. Chciałbym, aby oba zostały wyrównane na górze i ułożone od lewej do prawej, w jaki sposób mogę to osiągnąć za pomocą tego menedżera układu? Kod Pisałem jest następujący:

public GameSelectionPanel(){ 

    setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 

    setAlignmentY(TOP_ALIGNMENT); 

    setBorder(BorderFactory.createLineBorder(Color.black)); 

    JPanel botSelectionPanel = new JPanel(); 

    botSelectionPanel.setLayout(new BoxLayout(botSelectionPanel, BoxLayout.Y_AXIS)); 

    botSelectionPanel.setBorder(BorderFactory.createLineBorder(Color.red)); 

    JLabel command = new JLabel("Please select your opponent:"); 

    ButtonGroup group = new ButtonGroup(); 

    JRadioButton button1 = new JRadioButton("hello world"); 
    JRadioButton button2 = new JRadioButton("hello world"); 
    JRadioButton button3 = new JRadioButton("hello world"); 
    JRadioButton button4 = new JRadioButton("hello world"); 

    group.add(button1); 
    group.add(button2); 
    group.add(button3); 
    group.add(button4); 

    botSelectionPanel.add(command); 
    botSelectionPanel.add(button1); 
    botSelectionPanel.add(button2); 
    botSelectionPanel.add(button3); 
    botSelectionPanel.add(button4); 

    JPanel blindSelectionPanel = new JPanel(); 
    blindSelectionPanel.setBorder(BorderFactory.createLineBorder(Color.yellow)); 

    blindSelectionPanel.setLayout(new BoxLayout(blindSelectionPanel, BoxLayout.Y_AXIS)); 

    JRadioButton button5 = new JRadioButton("hello world"); 
    JRadioButton button6 = new JRadioButton("hello world"); 

    ButtonGroup group2 = new ButtonGroup(); 
    group2.add(button5); 
    group2.add(button6); 

    JLabel blindStructureQuestion = new JLabel("Please select the blind structure:"); 

    blindSelectionPanel.add(blindStructureQuestion); 
    blindSelectionPanel.add(button5); 
    blindSelectionPanel.add(button6); 

    add(botSelectionPanel); 
    add(blindSelectionPanel); 

    setVisible(true); 
} 

Odpowiedz

2

Cóż, metoda setAlignmentY tu nie ma żadnego wpływu, ponieważ działa ona na panelu uważane za składnik.

Jak można się domyślić, układ zawartych paneli jest definiowany przez menedżera układu, którego używasz. Niestety, BoxLayout nie udostępniaj funkcji, której szukasz.

w standardowym JDK, oczywiście, układ wyboru dla twojego problemu to GridBagLayout. Chociaż początkowo raczej trudno to zrozumieć, szybko ujawni ci on swoją moc w rozmieszczeniu elementów.

pomocą przydatnych GBC klasę, swoje elementy mogą być rozmieszczone w następujący sposób:

setLayout(new GridBagLayout(this)); 

add(botSelectionPanel, new GBC(0,1).setAnchor(TOP)); 
add(blindSelectionPanel, new GBC(0,2).setAnchor(TOP)); 

lub tak myślę ;-)

+0

Wow dude ładny link o tej klasie GBC. Chociaż zacząłem używać pełnego konstruktora GridBagConstraints. Nauczyłem się pozycji parametrów. Ale dla małych GUI GBC jest drogą do zrobienia. Dla większych GUI uważam, że najlepszym rozwiązaniem jest jednoliniowy konstruktor GridBagConstraints. – Timmos

+0

Konstruktor GridBagLayout nie ma parametru wejściowego –

+0

Twoja próba daje wyjątek w wątku "AWT-EventQueue-0" java.lang.IllegalArgumentException: niedozwolona wartość zakotwiczenia –

4

Riduidel jest prawidłowe ustawienie setAlignmentY na temat samego GameSelectionPanel i GridBagLayout jest doskonała alternatywa. Jeśli wolisz trzymać się z numerem BoxLayout, artykuł Fixing Alignment Problems omawia sprawę, sugerując, że "wszystkie komponenty kontrolowane przez od lewej do prawej Boxlayout powinny mieć zazwyczaj takie same wyrównanie Y". W twoim przykładzie dodaj

Powiązane problemy