我需要计算 a 的最小或默认大小Composite
,它可以在不裁剪的情况下显示所有组件。
我似乎只找到了计算Composite
. 这意味着一个Table
或其他滚动复合将具有显示完整内容而不滚动的首选大小。将ScrolledComposite
立即进入滚动模式,这不是我想要的。
GridLayout
设法通过将GridData
提示视为最小宽度/高度来做到这一点,从而允许抓住任何额外的可用空间。
我需要计算 a 的最小或默认大小Composite
,它可以在不裁剪的情况下显示所有组件。
我似乎只找到了计算Composite
. 这意味着一个Table
或其他滚动复合将具有显示完整内容而不滚动的首选大小。将ScrolledComposite
立即进入滚动模式,这不是我想要的。
GridLayout
设法通过将GridData
提示视为最小宽度/高度来做到这一点,从而允许抓住任何额外的可用空间。
Control#computeSize(int, int)
应该是您正在搜索的内容:
Point size = comp.computeSize(SWT.DEFAULT, SWT.DEFAULT);
System.out.println(size.x + " " + size.y);
我设法找到了解决方案。
关键是两个不同的东西:
ScrolledComposite
(如果从其子项外部调整大小)上设置调整大小侦听器GridData.grab
和GridData.hint
。提示将确保复合材料在您这样做时采用此大小computeSize()
,而 grab 确保它将抓住任何可用的额外空间。代码示例如下:
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell(display);
ScrolledComposite sc = new ScrolledComposite(shell, SWT.NONE);
Composite foo = new Composite(sc, SWT.NONE);
foo.setLayout(new GridLayout(1, false));
StyledText text = new StyledText(foo, SWT.NONE);
text.setText("Ipsum dolor etc... \n etc... \n etc....");
GridDataFactory.fillDefaults().grab(true, true).hint(40, 40).applyTo(text);
Listener l = new Listener() {
public void handleEvent(Event e) {
Point size = sc.getSize();
Point cUnrestrainedSize = content.computeSize(SWT.DEFAULT, SWT.DEFAULT);
if(size.y >= cUnrestrainedSize.y && size.x >= cUnrestrainedSize.x) {
content.setSize(size);
return;
}
// does not fit
Rectangle hostRect = getBounds();
int border = getBorderWidth();
hostRect.width -= 2*border;
hostRect.width -= getVerticalBar().getSize().x;
hostRect.height -= 2*border;
hostRect.height -= getHorizontalBar().getSize().y;
c.setSize(
Math.max(cUnrestrainedSize.x, hostRect.width),
Math.max(cUnrestrainedSize.y, hostRect.height)
);
}
}
sc.addListener(SWT.Resize, l);
foo.addListener(SWT.Resize, l);
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}