让 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
循环之后)。
我想要完成的是一个包含另外两个 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
循环之后)。