Сделайте JPanels одинаковыми с GridBagLayout

У меня есть несколько JPanel, все из которых основаны на предположении, что они имеют ширину в три столбца. И один или несколько столбцов высотой. На данный момент я использую для них GridBagLayout.

Я планирую добавить их друг под другом в другой JPanel. Проблема в том, что столбцы не выстраиваются в линию.

Могу ли я что-то сделать с этим, сохраняя отдельные панели JPanel отдельно друг от друга? Не возвращаясь к более фиксированному макету. Я мог бы дать JPanels родительский контейнер и добавить в него элементы, оставив сам JPanel пустым (когда он не находится в «автономном режиме»). Но я считаю такой подход отвратительным.

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: мой класс макета выглядит так:

public class Layout extends GridBagLayout {
    public void collocate_line(List<? extends JComponent> compos, final Container container) {
        int currentCol = 0;

        for (final JComponent compo: compos) {
            final GridBagConstraints gbc = new GridBagConstraints(
                    currentCol, this.currentLine, GRID_WIDTH, GRID_HEIGHT,
                    DEFAULT_WEIGHT_X, DEFAULT_WEIGHT_Y, GridBagConstraints.CENTER,
                    GridBagConstraints.BOTH, DEFAULT_INSETS, 0, 0);
            container.add(compo, gbc);
            currentCol++;
        }

        currentLine++;
    }
}

Содержащий JPanel выглядит так:

public class ScopePanel extends JPanel implements ActionListener {
    private final ChooseClassPath classPath;
    private final ChooseStubsJava stubsJava;

    public ScopePanel(final IPreparedCommands exec, final ResourceBundle messages) {
        super();

        final Layout gbl = new Layout();
        this.setLayout(gbl);

        this.classPath = new ChooseClassPath(exec, messages, gbl);
        this.add(this.classPath, GUIUtil.mkgbc_fillx(0, 0, GridBagConstraints.REMAINDER, 1));

        this.stubsJava = new ChooseStubsJava(exec, messages, gbl);
        this.add(this.stubsJava, GUIUtil.mkgbc_fillx(0, 2, GridBagConstraints.REMAINDER, 1));
    }
}

И элемент выглядит так:

public class ChooseClassPath extends JPanel {
    public ChooseClassPath(final IPreparedCommands exec, final ResourceBundle messages) {
        this(exec, messages, new Layout());
    }

    public ChooseClassPath(final IPreparedCommands exec, final ResourceBundle messages, final Layout layout) {
        super();

        { // Line 1
            final List<JComponent> line = new ArrayList<JComponent>();

            final JLabel label = new JLabel(messages.getString("label_classpath"));
            line.add(label);

            //...  
            layout.collocate_line(line, this);
        }
    }
}

Результат: введите здесь описание изображения


person milnet    schedule 05.03.2014    source источник
comment
Не могли бы вы опубликовать свой код?   -  person rogue-one    schedule 05.03.2014
comment
Есть вещи, которые вы можете, но это немного грязно. Вы можете положить все компоненты в один контейнер или попробовать miglayout, который, как я понимаю, может это сделать (сам не использовал его)   -  person MadProgrammer    schedule 05.03.2014


Ответы (1)


Убедитесь, что вы передаете набор свойств GirdBagConstraints, идентичный всем панелям JPanel. esp Свойства, такие как ширина сетки, заполнение, вес и т. д. Также содержимое внутри вашей JPanel, если оно различается для каждого экземпляра JPanel, может повлиять на индивидуальный размер сеток. Рассмотрите возможность использования GridLayout и переходите на GridBagLayout только в том случае, если ваши требования не могут быть выполнены с помощью GridLayout или любых других более простых макетов.

person rogue-one    schedule 05.03.2014