Я ожидал, что высота и ширина второй кнопки будут в два раза больше, чем высота и ширина первой кнопки
Ваши ожидания неверны.
Ячейки GridBagLayout являются гибкими. Ширина одного столбца не зависит от ширины других столбцов. Это зависит только от ширины дочерних компонентов в нем (а также от вставок и ipadx, если они установлены).
Если компонент занимает два столбца, но в этих столбцах больше ничего нет, у GridBagLayout нет оснований расширять столбцы больше, чем необходимо для размещения предпочтительной ширины этого компонента.
То же самое верно для высот и строк GridBagLayout.
Чтобы один компонент был в два раза больше другого, вам потребуется другой макет. SpringLayout может это сделать, хотя его нелегко использовать. Возможно, вам будет проще просто добавить ComponentListener на «меньший» компонент и использовать новый размер этого компонента в качестве основы для предпочтительного размера «большего» компонента .
Для достижения желаемого результата я бы использовал SpringLayout.
SpringLayout позволяет создавать ограничения, называемые Spring s, которые представляют диапазоны размеров для ребер, ширины и высоты компонентов. Они могут зависеть от диапазонов размеров других компонентов или краев контейнера.
SpringLayout layout = new SpringLayout();
setLayout(layout);
SpringLayout.Constraints jb1Constraints =
new SpringLayout.Constraints(jb1);
SpringLayout.Constraints jb2Constraints =
new SpringLayout.Constraints(
Spring.sum(jb1Constraints.getX(), jb1Constraints.getWidth()),
jb1Constraints.getY(),
Spring.scale(jb1Constraints.getWidth(), 2),
Spring.scale(jb1Constraints.getHeight(), 2));
SpringLayout.Constraints jb3Constraints =
new SpringLayout.Constraints(
Spring.sum(jb2Constraints.getX(),
Spring.scale(jb2Constraints.getWidth(), 0.5f)),
Spring.sum(jb2Constraints.getY(), jb2Constraints.getHeight()),
Spring.scale(jb1Constraints.getWidth(), 5),
Spring.scale(jb1Constraints.getHeight(), 5));
add(jb1, jb1Constraints);
add(jb2, jb2Constraints);
add(jb3, jb3Constraints);
// Make container big enough to hold all components.
layout.putConstraint(
SpringLayout.EAST, getContentPane(), 0,
SpringLayout.EAST, jb3);
layout.putConstraint(
SpringLayout.SOUTH, getContentPane(), 0,
SpringLayout.SOUTH, jb3);
Ограничения для jb1
самые простые: соблюдайте минимальный размер этого компонента, предпочтительный размер и максимальный размер. Расположение (0, 0).
Ограничения для jb2
зависят от ограничений jb1
:
- Пружина для координаты x в
jb2
равна jb1.x + jb1.width, которая фактически является правым краем jb1.
- jb2 имеет тот же y, что и jb1 (который фактически равен нулю).
- Ширина и высота соответствуют jb1, масштабируется на 2.
Ограничения для jb3
зависят как от jb2, так и от jb1:
- Координата x равна jb2.x + (jb2.width ÷ 2), то есть горизонтальная центральная точка jb2.
- Координата y равна jb2.y + jb2.height, которая фактически является нижним краем jb2.
- Ширина и высота соответствуют jb1, масштабируется на 5.
Наконец, SpringLayout отличается от других менеджеров компоновки тем, что он не устанавливает автоматически размер контейнера, который он планирует, чтобы он был достаточно большим для размещения всех дочерних компонентов. Мы должны сделать это самостоятельно, используя SpringLayout.putConstraint , чтобы связать правый край контейнера (EAST) с правым краем jb3, а нижний край контейнера (SOUTH) - с нижним краем jb3.