Почему в Java awt GridBagLayout, gridwidth или gridheight занимают одну строку или один столбец меньше указанного? - PullRequest
0 голосов
/ 10 января 2019

Я пишу простую 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 Ответ

0 голосов
/ 10 января 2019

Исходный код в вопросе выглядит так:

four buttons arranged in three columns

И вы хотите, чтобы он отображался так, верно?

four buttons arranged in four columns

Хорошо ... Я сделал это изображение, добавив эти строки после строки 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);

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

...