Сохранение предпочтительных размеров компонентов в центре BorderLayout

У меня есть пользовательский интерфейс среднего размера, который использует BorderLayout; центр представляет собой панель с вкладками, содержащую различные панели с различными макетами и т. д.

Я хочу, чтобы панель в центре этого макета границы изменяла размер в соответствии с размером окно, но я не хочу, чтобы компоненты внутри панели растягивались. Метки, поля со списком, текстовые поля, кнопки — я хочу, чтобы они оставались в своих предпочтительных размерах и позволяли панели, содержащей их, растягиваться. Я помещаю их в панель прокрутки на случай, если места станет слишком мало для панели.

Различные плакаты с красочными словарями предупреждают об опасности использования любого из методов setXXXsize() для компонентов. Это то, что я делаю сейчас, и я хотел бы узнать, как этого избежать.

GridBagLayout не подходит для некоторых моих панелей. Он по своей природе ориентирован на строки и столбцы, и не все вписывается в строки и столбцы. Конечно, я мог бы создать искусственные строки и столбцы, чтобы вместить все, но я действительно надеюсь, что Swing имеет больше вариантов макета, чем это.

Вертикальный клей тоже не подходит. Я включил его в любимый SSCE HFOE:

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

    }

Если вы увеличите окно, выпадающие списки в центре увеличатся; как написано, вертикальный кусок клея под ними также увеличивается, но не занимает все доступное пространство. Кажется, ему отведено столько же места, сколько каждому из них.

Так как же лучше подойти к этому?

5
задан arcy 2 March 2012 в 16:42
поделиться