Java 的 SWT:设置组的大小隐藏其小部件

Java's SWT: Setting the size of Group hides its widgets

我想在 GridLayout 中设置一个带有一些小部件的组。
我还希望组组件的大小为固定大小 (250x250),并希望其上的小部件能够容纳(在其内部均匀分布在两列中)。
但是当我设置组的大小时,它隐藏了它的小部件。

考虑一下:

public class Gui {

    public static void main(String[] args) {
        Gui g=new Gui();
        g.run();
    }

    private Shell shell;
    private Display display;
    private ChartComposite composite;


    public Gui() {
        display=new Display();
        shell=new Shell(display);
        shell.setSize(500, 500);

        Group group=new Group(shell, SWT.NONE);
        group.setText("Group");
        group.setSize(250,250); // this causes trouble

        GridLayout group_layout=new GridLayout();
        group_layout.numColumns=2;
        group_layout.marginBottom=10;
        group_layout.marginTop=10;
        group.setLayout(group_layout);

        Button b1=new Button(group, SWT.PUSH);
        b1.setText("Button1");

        Button b2=new Button(group, SWT.PUSH);
        b2.setText("Button2");

        Button b3=new Button(group, SWT.PUSH);
        b3.setText("Button3");

        Button b4=new Button(group, SWT.PUSH);
        b4.setText("Button4");
    }

    public void run() {
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

输出:

但是现在看看当我将调用重新定位到 setSize() 时会发生什么:

public class Gui {

    public static void main(String[] args) {
        Gui g=new Gui();
        g.run();
    }

    private Shell shell;
    private Display display;
    private ChartComposite composite;

    public Gui() {
        display=new Display();
        shell=new Shell(display);
        shell.setSize(500, 500);

        Group group=new Group(shell, SWT.NONE);
        group.setText("Group");

        GridLayout group_layout=new GridLayout();
        group_layout.numColumns=2;
        group_layout.marginBottom=10;
        group_layout.marginTop=10;
        group.setLayout(group_layout);

        Button b1=new Button(group, SWT.PUSH);
        b1.setText("Button1");

        Button b2=new Button(group, SWT.PUSH);
        b2.setText("Button2");

        Button b3=new Button(group, SWT.PUSH);
        b3.setText("Button3");

        Button b4=new Button(group, SWT.PUSH);
        b4.setText("Button4");

        group.setSize(250,250);  // relocated
    }

    public void run() {
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

输出:

有人对此行为有解释吗?

正如我提到的,在添加小部件之前我需要组的大小为 (250x250),这样它们才能适当地容纳,但我无法完成此操作如果 setSize() 隐藏了我的小部件。

通过调用组合的 layout() 方法计算和应用布局。在您的第一个片段中,这从未完成。调整复合材料的大小也会触发重新布局。这就是为什么在第二个代码段中调用 setSize() 会触发布局。它在您的第一个代码段中不起作用,因为在您调用 setSize().

时尚未设置 GridLayout

除了延迟 setSize() 调用外,您还可以在设置布局并创建所有子项后调用 group.layout()

在仅使用布局而非绝对定位的 UI 中,对 shell.pack() 的一次调用将递归触发所有布局。