Вопрос

Я пытаюсь нарисовать боковую панель для проекта, над которым я работаю.Я решил использовать GridBagLayout, потому что меня расстроили ограничения BoxLayout.Не мог бы кто-нибудь помочь объяснить, что я делаю не так?Что я хочу, так это чтобы боковая панель содержала две JPanels.Код, который у меня есть, размещает их на полпути вниз по боковой панели, а не вверху.Не мог бы кто-нибудь объяснить, чего мне здесь не хватает?

    JPanel sideBar = new JPanel();
    sideBar.setBounds(0, 0, 180, (int)this.getBounds().getHeight());
    sideBar.setLayout(new GridBagLayout());


    JPanel optionBar = new JPanel();
    optionBar.setBorder(BorderFactory.createTitledBorder("Box1"));
    optionBar.setLayout(new GridBagLayout());


    JPanel buttonBar = new JPanel();
    buttonBar.setBorder(BorderFactory.createTitledBorder("Options"));
    buttonBar.setLayout(new GridBagLayout());


    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.ipady = 5;
    c.insets = new Insets(10,0,0,0);


    JButton simplify;
    simplify = new JButton("Open");
    simplify.addActionListener( this.listener );
    c.gridy = 0;
    buttonBar.add(simplify, c);

    JButton mergeButton;
    mergeButton = new JButton("Close");
    mergeButton.addActionListener( this.listener );
    c.gridy = 1;
    buttonBar.add(mergeButton, c);

    JButton splitButton;
    splitButton = new JButton("Merge");
    splitButton.addActionListener( this.listener );
    c.gridy = 2;
    buttonBar.add(splitButton, c);

    c.insets = new Insets(0,5,5,5);
    c.gridy = 0;
    sideBar.add(optionBar, c);

    c.gridy = 1;
    c.ipadx = 70;
    sideBar.add(buttonBar, c);

    return(sideBar);
Это было полезно?

Решение

GridBagLayout выделит только столько вертикального пространства, сколько требуется компоненту, оставив остальное пустым.Я полагаю, вы видите, что компоненты вашей боковой панели расположены вертикально?

Для того чтобы "вытолкнуть" компоненты наружу, вам нужно установить вертикальный вес.Если вы установите weighty ограничение до 1.0 для вашего последнего компонента, оно займет все оставшееся вертикальное пространство для этого компонента и переместит остальное наверх.(Возможно, вам также потребуется привязать эту последнюю панель к GridBagConstraints.NORTH).

Попробуй c.weighty = 1.0 до того, как sideBar.add(buttonBar, c);

Другие советы

Если вы знакомы / чувствуете себя более комфортно с HTML, вы могли бы использовать табличка2gridbag.Это небольшой консольный инструмент, который берет описание макета (HTML-таблицу) и преобразует его в эквивалентное описание макета для настройки менеджера GridBagLayout

Имеющийся у меня код размещает их посередине боковой панели, а не вверху.

Что ж, вам нужно начать с прочтения Учебное пособие по Swing чтобы узнать, как правильно использовать менеджеры верстки.BoxLayout намного проще, чем GridBagLayout, потому что вам не нужно учиться указывать ограничения.Но если вы хотите использовать GridBagLayout, то прочтите раздел "Как использовать GridBagLayout".Возможно, вы захотите сосредоточиться на разделе, посвященном ограничениям "weightx и weightty".Основываясь на моих ограниченных знаниях, это должно помочь решить проблему.

Кроме того, при использовании менеджеров компоновки вы не используете setBounds() или setSize().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top