为什么复合由文本字段扩展?
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();
我创建了一个使用 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();