我为深入 SWT 进行了长期斗争,而且我还没有真正完成一半(这里生气的脸)。
我有带有 RowLayout 的 Group,可以换行。该组位于其他复合材料中,可能会变得太大而无法显示,因此我用 ScrolledComposite 包裹它。
这就是麻烦开始的地方。
ScrolledComposite 中的任何内容都会以宽度和高度的方式发挥作用,无论尺寸是什么。它有一些逻辑,因为 SrolledComposite 可以用 ScrollBars 来处理这个问题。
事情是(或者至少在我看来),如果 RowLayout 可以随心所欲地控制宽度,它永远不会换行,这不是它在本身受到限制的父级中应该做的事情.
这个问题的预期解决方案是什么?
设置为滚动组合的 content 的控件布局(即
sc.setContent
的参数)并不重要。布局仅影响所设置的控件的直接子级。
最有可能的是,您的组小部件不适应包含滚动组合的大小。注意:它通常有助于对相关小部件进行不同的着色(使用
setBackground
)以查看它们实际占用的空间。
如果
ScrolledComposite
控件大于滚动复合的客户区域,以下代码片段将创建一个垂直滚动的 content
。
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("ScrolledComposite in 'browser' mode");
shell.setLayout(new FillLayout());
ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
Composite content = new Composite(scrolledComposite, SWT.NONE);
content.setLayout(new RowLayout(SWT.HORIZONTAL));
for (int i = 0; i < 300; i++) {
Label label = new Label(content, SWT.NONE);
label.setText("label " + i);
}
scrolledComposite.setContent(content);
scrolledComposite.addListener(SWT.Resize, event -> {
int width = scrolledComposite.getClientArea().width;
scrolledComposite.setMinSize(content.computeSize(width, SWT.DEFAULT));
});
scrolledComposite.setExpandHorizontal(true);
scrolledComposite.setExpandVertical(true);
shell.setSize(600, 300);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
代码使用“浏览器模式”,如 JavaDoc
中所述设置控件的最小尺寸,如果可见区域小于控件的最小尺寸,ScrolledComposite 将显示滚动条;如果可见区域大于最小尺寸,则 ScrolledComposite 将扩大控件的尺寸。这需要调用 setMinWidth()、setMinHeight() 和 setExpandHorizontal()、setExpandVertical()。
在调整大小侦听器中设置
minSize
可确保最小尺寸适应滚动复合材料的尺寸。