繁体   English   中英

带有包装文字的垂直滚动复合

[英]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,并且窗口反映了该大小。 但是,当我缩小它时,文本仍然不会自动换行。 如何正确设置ScrolledComposite以垂直滚动和环绕文本? 我怀疑scrollArea的宽度没有传播到其子段落

我认为您使用的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.");

为了支持在窗口调整大小时自动换行,我已经在调整大小侦听器内部更新了宽度提示。

在此处输入图片说明

// 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM