Проблема Swing BoxLayout с JComboBox без использования setXXXSize

вот SSCCE:

import java.awt.Color;
import java.awt.Dimension;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class BoxLayoutTest extends JFrame {

    public BoxLayoutTest(){
        JPanel main = new JPanel();
        main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS));
        main.setBackground(Color.red);
        this.add(main);
        JPanel northPanel = new JPanel();

        JPanel middle = new JPanel();
        middle.setLayout(new BoxLayout(middle, BoxLayout.X_AXIS));
        middle.add(new JButton("FOO"));
        middle.add(Box.createHorizontalGlue());

        JPanel aPanel = new JPanel();
        aPanel.setBackground(Color.black);

            JComboBox b = new JComboBox();
    //b.setPreferredSize(new Dimension(100,16)); //uncomment this to see the layout I would like to achieve
    //b.setMaximumSize(new Dimension(100,16));
        //middle.add(b); //uncomment this line 

        middle.setBackground(Color.green);
        northPanel.setBackground(Color.blue);

        main.add(northPanel);
        main.add(middle);
        main.add(Box.createVerticalGlue());

        this.setSize(800,600);
        this.setResizable(true);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new BoxLayoutTest();
    }

}

Я пытаюсь реорганизовать некоторые классы, написанные мной некоторое время назад, когда я не знал, что использование методов setXXXSize для компонентов неправильно. Используя рамку с изменяемым размером, я хочу добиться следующего результата:

  1. Северная панель должна оставаться наверху и изменять ее размер в соответствии с изменениями размера кадра (кажется, работает нормально)
  2. Зеленый панель, на которую я поместил JButton, должна сохранять максимальный размер JButton и оставаться чуть ниже синей панели выше (это отлично работает, если я помещаю только JButtons внутри этой панели).

Проблема возникает, если я помещаю JComboBox внутри зеленой панели (попробуйте раскомментировать строку в SSCCE). Я предполагаю, что JComboBox не имеет максимального размера, поэтому он растягивается вместе с фреймом. В предыдущей неправильной версии моего кода я использовал методы setxxxSize в JComboBox, чтобы ограничить его размер (попробуйте раскомментировать строку в методах setXXXSize, чтобы увидеть это).

Мой вопрос:

  1. Можно ли достичь того же результата с помощью BoxLayout без вызова методов setXXXSize ()?
  2. Если да, то как?
  3. Есть ли другой LayoutManager, который я могу использовать для этого эффект?

Пожалуйста, направьте меня в правильном направлении

5
задан Heisenbug 28 September 2011 в 10:40
поделиться