带换行文本的垂直滚动复合

Vertical ScrolledComposite with Wrapped Text

我正在尝试在多个标签小部件中创建一个带有文本的垂直滚动框,但是 我似乎可以让标签文本完全换行。

我已经将范围缩小到这个最小的例子来重现这个问题。

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

public class Main {
    public static void main(String[] args) {
        // Create window.
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Test");
        shell.setSize(320, 240);
        shell.setLayout(new FillLayout());

        // Create scroll container.
        final ScrolledComposite scrollContainer = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.BORDER);

        // Create scroll area.
        final Composite scrollArea = new Composite(scrollContainer, SWT.NONE);
        scrollArea.setLayout(new RowLayout(SWT.VERTICAL));

        // Setup scrolling.
        scrollContainer.setExpandHorizontal(true);
        scrollContainer.setExpandVertical(true);
        scrollContainer.addListener(SWT.Resize, (event) -> {
            int width = scrollContainer.getClientArea().width;
            Point size = scrollArea.computeSize(width, SWT.DEFAULT);
            scrollContainer.setMinSize(size);
            System.out.println("Size: " + size.x + "x" + size.y);
        });
        scrollContainer.setContent(scrollArea);

        // Create paragraph.
        Label paragraph = new Label(scrollArea, SWT.WRAP);
        paragraph.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");

        // Display window.
        //shell.pack();
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }
}

当我运行这个时,记录的大小将是 316x23 所以宽度看起来正确但是 高度仅计算为适合一行。如果我输入 shell.pack()shell.open() 之前,记录的大小为 2648x23,而 window 反映 那个尺寸。但是,当我缩小它时,文本仍然不会换行。你怎么 正确设置 ScrolledComposite 以垂直滚动和换行文本?我 怀疑 scrollArea 的宽度没有传播到它的 child paragraph.

我认为您使用的 RowLayout 不处理包装标签。使用带有 Label 宽度提示的 GridLayout 似乎有效:

// Create scroll area.
final Composite scrollArea = new Composite(scrollContainer, SWT.NONE);
scrollArea.setLayout(new GridLayout());

// Setup scrolling.
scrollContainer.setExpandHorizontal(true);
scrollContainer.setExpandVertical(true);

// Create paragraph.
final Label paragraph = new Label(scrollArea, SWT.WRAP);
paragraph.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");

// Layout data for label, width a bit smaller than the shell
final GridData data = new GridData(SWT.LEAD, SWT.TOP, false, false);
data.widthHint = shell.getSize().x - 10;
paragraph.setLayoutData(data);

// Can do compute size immediately
final Point size = scrollArea.computeSize(SWT.DEFAULT, SWT.DEFAULT);
scrollContainer.setMinSize(size);
System.out.println("Size: " + size.x + "x" + size.y);

scrollContainer.setContent(scrollArea);

另一种方法是使用指定滚动条的只读 Text 控件 - 这不需要在 ScrolledComposite 中。以上所有内容将替换为:

final Text paragraph = new Text(shell, SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
paragraph.setEditable(false);
paragraph.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");

为了在 window 调整大小时支持文本换行,我更新了调整大小侦听器内部的宽度提示。

// Create scroll container.
final ScrolledComposite scrollContainer = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.BORDER);
scrollContainer.setExpandHorizontal(true);
scrollContainer.setExpandVertical(true);

// Create scroll area.
final Composite scrollArea = new Composite(scrollContainer, SWT.NONE);
final GridLayout scrollLayout = new GridLayout();
scrollArea.setLayout(scrollLayout);

// Create paragraph.
Label paragraph = new Label(scrollArea, SWT.WRAP);
paragraph.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
final GridData paragraphData = new GridData(SWT.LEAD, SWT.TOP, false, false);
paragraph.setLayoutData(paragraphData);

// Setup scrolling.
scrollContainer.addListener(SWT.Resize, (event) -> {
  int width = scrollContainer.getClientArea().width;
  paragraphData.widthHint = width - scrollLayout.marginWidth; // Add padding to right.
  Point size = scrollArea.computeSize(SWT.DEFAULT, SWT.DEFAULT);
  scrollContainer.setMinSize(size);
});

scrollContainer.setContent(scrollArea);