Java、SWT 如何使 RowLayout 在 ScrolledCompositite 中工作?

问题描述 投票:0回答:1

我为深入 SWT 进行了长期斗争,而且我还没有真正完成一半(这里生气的脸)。

我有带有 RowLayout 的 Group,可以换行。该组位于其他复合材料中,可能会变得太大而无法显示,因此我用 ScrolledComposite 包裹它。

这就是麻烦开始的地方。

ScrolledComposite 中的任何内容都会以宽度和高度的方式发挥作用,无论尺寸是什么。它有一些逻辑,因为 SrolledComposite 可以用 ScrollBars 来处理这个问题。

事情是(或者至少在我看来),如果 RowLayout 可以随心所欲地控制宽度,它永远不会换行,这不是它在本身受到限制的父级中应该做的事情.

这个问题的预期解决方案是什么?

swt
1个回答
1
投票

设置为滚动组合的 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
可确保最小尺寸适应滚动复合材料的尺寸。

© www.soinside.com 2019 - 2024. All rights reserved.