Swing: якорь GridBagLayouts не работает, вложенный в другой GridBagLayout

Я устанавливаю первый GridBagLayout в основной JPanel. К этой панели были добавлены десять других панелей с этим макетом (outerConstraints). Подпанели содержат количество текстов, которые должны быть размещены ЗАПАД с новой раскладкой и innerConstraints. Но они центрируются.

Немного потестировав, я обнаружил, что тексты/изображения размещаются ЗАПАДНО, но только в том случае, если outerConstraints не заполняют белую панель по горизонтали. Проблема в том, что я не могу удалить эту команду, потому что мне нужно, чтобы все панели имели одинаковую ширину.

Есть ли возможность разрешить outerConstraints заполнять И сделать его вложенным GridBagLayout позиционирующим текст слева?

setLayout(new GridBagLayout());

GridBagConstraints outerConstraints = new GridBagConstraints();
outerConstraints.insets = new Insets(5, 5, 5, 5);
outerConstraints.fill = GridBagConstraints.HORIZONTAL;    // seems to be reason, but needed.

    for (int i = 0; i < 10; i++) {

        outerConstraints.gridx = i % 2;
        outerConstraints.gridy = i / 2;

        JPanel agentVisitCard = new JPanel();
        add(agentVisitCard, outerConstraints);

        GridBagConstraints innerConstraints = new GridBagConstraints();
        innerConstraints.anchor = GridBagConstraints.WEST;                 //fails
        innerConstraints.insets = new Insets(5, 5, 5, 5);

        GridBagLayout layout = new GridBagLayout();
        agentVisitCard.setLayout(layout);

        (...)

        JLabel label = new JLabel("Agent " + (i + 1) + ":");

        innerConstraints.gridx = 0;
        innerConstraints.gridy = 0;

        agentVisitCard.add(label, innerConstraints);

Агент 3 не выравнивается по левому краю: введите здесь описание изображения


person Gary Klasen    schedule 15.09.2015    source источник
comment
Попробуйте также сделать так, чтобы innerConstraints заполнялись горизонтально.   -  person gla3dr    schedule 15.09.2015
comment
Если это не сработает, попробуйте установить для weightx какое-нибудь ненулевое значение (1.0 подойдет).   -  person gla3dr    schedule 15.09.2015
comment
Ну, я не могу точно сказать, что ты делаешь. Похоже, ваш код пытается добавить 2 компонента в каждую строку, но я вижу только 1. Все ваши панели выглядят для меня одинакового размера, поэтому, возможно, вам следует использовать GridLayout. Другой способ убедиться, что компоненты выровнены по левому краю, — создать JPanel с FlowLayout и LEFT_ALIGNMENT. Так что, возможно, у вас есть такая структура, как главная панель, панель потока, панель агента. В любом случае опубликуйте правильный SSCCE, демонстрирующий проблему. Для лучшей помощи.   -  person camickr    schedule 15.09.2015
comment
Второй комментарий работает. :) Спасибо! Я приму ваш ответ, если вы отметите его.   -  person Gary Klasen    schedule 15.09.2015


Ответы (1)


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

Вот цитата из учебников по Swing (под weightx, весомый раздел), который объясняет это:

Если вы не укажете хотя бы одно ненулевое значение для weightx или weighty, все компоненты будут слипаться в центре своего контейнера. Это связано с тем, что когда вес равен 0,0 (по умолчанию), GridBagLayout помещает любое дополнительное пространство между сеткой ячеек и краями контейнера.

По умолчанию, weightx и weighty равны 0, поэтому у вас это не сработало. Так как вы хотели привязать его только горизонтально, установка значения weightx на ненулевое значение позволяла это работать. Если вам нужен вертикальный якорь, вам также нужно будет установить утяжеление.

Объяснение того, как следует использовать значения weightx и weighty, следующее:

Обычно веса задаются крайними значениями 0,0 и 1,0: числа между ними используются по мере необходимости. Большие числа указывают на то, что строка или столбец компонента должны занимать больше места.

Хотя они рекомендуют использовать значения от 0,0 до 1,0, это не обязательно. Любое значение double будет работать. Важно соотношение весов компонентов, если их несколько.

person gla3dr    schedule 15.09.2015