为什么复合由文本字段扩展?

Why composite is expanded by text field?

我创建了一个使用 GridLayout 的文本字段,并将 GridData (grabExcessHorizontalSpace) 的第三个参数设置为 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");

我假设您在 Shell 上调用 pack 来完成布局。这会导致控件按其首选大小调整大小 - Text 控件的首选大小是没有换行的大小。

如果您希望 shell 为特定大小,您可以在 shell 上 layout 而无需调用 pack。然后文本应该换行。

或者为 Text 控件指定一个 widthHint

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

我在 Windows 10 上用 SWT 3.103.2 试过了。 Greg 似乎在 Mac 上获得了

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