让 GridLayout 中的 Composite 占用其子项所需的 space

Let a Composite in a GridLayout take as much space as its children need

我想要完成的是一个包含另外两个 Composite 的 Composite。第一个 Composite 应该是一个可滚动的菜单。除此之外,我希望它在不提供任何绝对大小的情况下,根据其子项的需要获取尽可能多的 space 。另一个 Composite 包含主要内容,应该拿走所有剩余的 space.

现在我的示例代码没有显示滚动条,这是因为我没有对其调用 setMinSize()。但是,我不知道如何计算 setMinSize(),因为内部 Composite 使用与 ScrollableComposite 相同的大小并削减了它的一些内容。

我想问题是,是否可以使用 GridLayout 来根据需要使用尽可能多的 space 而其父项取决于子项的实际大小。

这是我的代码:

Composite composite = new Composite(shell, SWT.NONE);
composite.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_YELLOW));
GridLayoutFactory.fillDefaults().numColumns(2).applyTo(composite);

ScrolledComposite scrolledComposite = new ScrolledComposite(composite, SWT.H_SCROLL |
        SWT.V_SCROLL);
scrolledComposite.setExpandHorizontal(true);
scrolledComposite.setExpandVertical(true);
// scrolledComposite.setMinSize(SWT.DEFAULT, 200);
GridDataFactory.fillDefaults().grab(false, true).applyTo(scrolledComposite);

Composite composite1 = new Composite(scrolledComposite, SWT.NONE);
scrolledComposite.setContent(composite1);
composite1.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_BLUE));
GridLayoutFactory.fillDefaults().numColumns(1).applyTo(composite1);

Button button11 = new Button(composite1, SWT.PUSH);
button11.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_GREEN));
button11.setText("One One One One One");
GridDataFactory.fillDefaults().applyTo(button11);

for (int i = 0; i < 10; ++i) {
    Button button12 = new Button(composite1, SWT.PUSH);
    button12.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_GREEN));
    button12.setText("One Two");
    GridDataFactory.fillDefaults().applyTo(button12);
}

Composite composite2 = new Composite(composite, SWT.NONE);
composite2.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_RED));
GridDataFactory.fillDefaults().grab(true, true).applyTo(composite2);
GridLayoutFactory.fillDefaults().numColumns(2).applyTo(composite2);

Button button2 = new Button(composite2, SWT.PUSH);
button2.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_GREEN));
button2.setText("Two");
GridDataFactory.fillDefaults().applyTo(button2);

使用

scrolledComposite.setMinSize(composite1.computeSize(SWT.DEFAULT, SWT.DEFAULT));

将所有内容添加到 composite1 以将滚动的复合最小尺寸设置为为复合计算的尺寸(因此将其放在 for 循环之后)。