Почему в Java awt GridBagLayout, gridwidth или gridheight занимают одну строку или один столбец меньше указанного?
Я пишу простую программу AWT с GridBagLayout, в которой у меня есть четыре кнопки, расположенные по диагонали с использованием gridx, gridy. Когда я устанавливаю gridwidth как 3, он охватывает только 2 столбца и игнорирует его собственный столбец. Это то же самое для высоты сетки (это занимает 1 ряд меньше).
import java.applet.Applet;
import java.awt.Button;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
public class Second extends Applet{
@Override
public void init()
{
GridBagLayout bl = new GridBagLayout();
this.setLayout(bl);
GridBagConstraints gc = new GridBagConstraints();
gc.gridx = 0;
gc.gridy= 0;
gc.gridwidth = 4;
gc.fill = GridBagConstraints.HORIZONTAL;
Button btemp = new Button("Button1");
add(btemp, gc);
gc.gridx = 1;
gc.gridy= 1;
gc.gridwidth = 1;
add(new Button("Button2"), gc);
gc.gridx = 2;
gc.gridy= 2;
add(new Button("Button3"), gc);
gc.gridx = 3;
gc.gridy= 3;
add(new Button("Button4"), gc);
setVisible(true);
}
}
1 ответ
Исходный код в вопросе выглядит так:
И вы хотите, чтобы это выглядело так, верно?
Ну... я сделал это изображение, добавив эти строки после add(new Button("Button4"), gc);
линия. (Порядок, в котором вы добавляете Components
похоже, не влияет на результат.)
//First, let us tell AWT to figure out the sizes of components
// it has so far. If we do not do this, calls to getWidth()
// will return 0 sometimes! It appears to be a race condition,
// but that's why this layoutContainer method exists.
bl.layoutContainer(this);
//Now, let us target the missing grid cell.
gc.gridx = 0;
gc.gridy = 1;
//Let us put something in there, so the whole column has a
// non-zero width. Using the width of an existing button
// is better than just picking some number of pixels.
add(Box.createHorizontalStrut(this.getComponent(2).getWidth()),gc);
//Let us adjust the applet window size (optional)
this.setSize(this.getComponent(2).getWidth() * 4, 200);
Готовы ли вы поместить невидимый компонент в эту позицию в сетке, или вам нужно решить это по-другому?