我有一个包含表格和按钮组件的向导。当我点击添加按钮时,我从对话框窗口中选择应该将哪些项目添加到表格中。我确认项目,然后这些项目出现在带有滚动条的表格中。但是,如果我调整向导的大小,则会更改表的大小。如何解决?
调整大小之前的表:
向导调整大小后的表
Composite compositeArea = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
compositeArea.setLayout(layout);
Table table = new Table(compositeArea, SWT.BORDER | SWT.V_SCROLL);
new TableColumn(someList, SWT.NULL);
table.setLayoutData(new GridData(HORIZONTAL_ALIGN_FILL | GRAB_HORIZONTAL));
答案 0 :(得分:1)
**请注意,不建议使用HORIZONTAL_ALIGN_FILL
和GRAB_HORIZONTAL
。相反,您应该使用public GridData(int, int, boolean, boolean)
构造函数。 **
轻松简化您的代码段(复合材料上只有一列,只有一个默认表列 - 请参阅下面的完整代码):
// ...
final Composite compositeArea = new Composite(parent, SWT.NONE);
compositeArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
compositeArea.setLayout(new GridLayout());
final Table table = new Table(compositeArea, SWT.BORDER | SWT.V_SCROLL);
table.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
// ...
...我们发现Table
不适合可用空间或按预期显示滚动条,并且Shell
调整大小时会出现同样的情况。
在回答您的问题时,这是因为Table
的布局数据不知道如何垂直布局 - 您只指定了两个水平 style attributes。
如果我们改为使用建议的构造函数:
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
... Table
使可用空间正确,显示滚动条,并在Shell
调整大小时正确更新。使用布局数据,我们告诉Table
填充可用的水平空间,Table
将在必要时显示滚动条。
完整示例:
public class TableResizeTest {
private final Display display;
private final Shell shell;
public TableResizeTest() {
display = new Display();
shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setMaximized(true);
final Composite parent = new Composite(shell, SWT.NONE);
parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
parent.setLayout(new GridLayout());
// -- snippet --
final Composite compositeArea = new Composite(parent, SWT.NONE);
compositeArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
compositeArea.setLayout(new GridLayout());
final Table table = new Table(compositeArea, SWT.BORDER | SWT.V_SCROLL);
// table.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
// -------------
for (int i = 0; i < 20; ++i) {
new TableItem(table, SWT.NONE).setText(String.valueOf(i));
}
}
public void run() {
shell.setSize(300, 300);
shell.open();
while (!shell.isDisposed()) {
if (display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
public static void main(final String... args) {
new TableResizeTest().run();
}
}