Почему в 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);

Готовы ли вы поместить невидимый компонент в эту позицию в сетке, или вам нужно решить это по-другому?

Другие вопросы по тегам