Сохранение предпочтительных размеров компонентов в центре BorderLayout - PullRequest
5 голосов
/ 02 марта 2012

У меня средний и большой пользовательский интерфейс, который использует 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();
        }

    }

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

Так, как хороший способ приблизиться к этому?

Ответы [ 2 ]

10 голосов
/ 02 марта 2012

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

}

См. Также этот ответ .Существует несколько способов решить эту проблему.

image

0 голосов
/ 02 марта 2012

Я бы порекомендовал вам использовать JPanel с javax.swing.GroupLayout.Однако использовать этот макет нелегко, кодируя его.Используйте генераторы кода, такие как Netbeans Matisse Builder и скопируйте и вставьте его в любое место, если вы не хотите использовать IDE.

...