2015-09-15 3 views
0

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

После небольшого тестирования я узнал, что тексты/изображения помещены в WEST, но только если 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 не выравнивать влево: enter image description here

+0

Попробуйте сделать внутренние контуры заполнены горизонтально. – gla3dr

+0

Если это не сработает, попробуйте установить weightx на некоторое ненулевое значение (1.0 будет работать нормально). – gla3dr

+0

Ну, я не могу сказать, что вы делаете. Похоже, ваш код пытается добавить 2 компонента в каждую строку, но я вижу только 1. Ваши панели выглядят одинаково для меня, поэтому, возможно, вы должны использовать GridLayout. Другой способ убедиться, что компоненты выровнены слева, - это создать JPanel с FlowLayout и LEFT_ALIGNMENT. Так что, возможно, у вас есть структура, например, основная панель, панель потока, панель агента. В любом случае опубликуйте надлежащую [SSCCE] (http://sscce.org/), которая демонстрирует проблему. Для лучшей помощи. – camickr

ответ

2

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

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

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

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

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

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

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

Смежные вопросы