为什么复合文本会按文本字段展开?

时间:2018-11-29 09:01:59

标签: eclipse eclipse-plugin swt e4

我创建了一个使用GridLayout的文本字段,并将GridDatagrabExcessHorizontalSpace)的第3个参数设置为true。当我设置很长的非空白字符序列时,Text字段不会换行。 Composite通过文本字段展开。

下面是我的代码:

Composite composite = new Composite(m_shell, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
composite.setLayout(new GridLayout(2, false));

Label label = new Label(composite, SWT.LEAD);
label.setText("Label");
label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));

Text text = new Text(composite,SWT.MULTI|SWT.BORDER|SWT.WRAP|SWT.V_SCROLL);
GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
gd.heightHint = 2 * text.getLineHeight();
text.setLayoutData(gd);
text.setText("trweghjfbfdshjfghjreuyhjfghkjhjhjsdghjreewhjdfghjhjgfdhjsdghjtreuytrehjdfghjhjdfgh8irtrhjghjhjdfghjdfghjfghjdfg");

2 个答案:

答案 0 :(得分:2)

我假设您正在pack上致电Shell来完成布局。这会导致控件的大小按其首选大小进行调整-Text控件的首选大小是不包含包装的大小。

如果您希望外壳为特定大小,则可以在外壳上layout,而无需调用pack。然后,文字应自动换行。

或者为widthHint控件指定Text

答案 1 :(得分:1)

widthHint设置为0以及将horizontalAlignment设置为SWT.FILL会使文本填充其列中的所有可用空间,但不会增加更多。相反,它可以根据需要包装:

Screenshot

我在Windows 10上使用SWT 3.103.2。进行了尝试。 Greg在Mac上似乎有another result

Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout());

Composite composite = new Composite(shell, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
composite.setLayout(new GridLayout(2, false));

Label label = new Label(composite, SWT.LEAD);
label.setText("Label");
label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));

Text text = new Text(composite, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
gd.heightHint = 2 * text.getLineHeight();

// Added widthHint
gd.widthHint = 0;
text.setLayoutData(gd);
text.setText("trweghjfbfdshjfghjreuyhjfghkjhjhjsdghjreewhjdfghjhjgfdhjsdghjtreuytrehjdfghjhjdfgh8irtrhjghjhjdfghjdfghjfghjdfg");

shell.pack();
shell.open();

while (!shell.isDisposed()) {
    if (!display.readAndDispatch()) {
        display.sleep();
    }
}

display.dispose();