我有一个表单,在表单的一部分中,我在工具栏上有一个操作。 运行该操作应该导致在表单中使用动态列和行绘制swt表。
问题是,我设法做到这一点的唯一方法是最初创建一个空表,然后将表句柄传递给稍后将填充它的操作。
如果我有动作代码来绘制表格,则表格不会展开(滚动)以显示整个表格。
有没有办法在不创建初始表的情况下实现我想要的目标?
我使用Composite的代码是这样的: 用于在表单构造中创建复合:
gd = new GridData();
gd.widthHint = 400;
gd.heightHint = 200;
tableComposite = new Composite(this.client, SWT.None);
tableComposite.setLayoutData(gd);
在动作代码中:
GridData gd = new GridData();
gd.widthHint = 400;
gd.heightHint = 200;
if (this.viewer != null) {
this.viewer.getTable().setRedraw(false);
while (this.viewer.getTable().getColumnCount() > 0) {
this.viewer.getTable().getColumns()[0].dispose();
}
this.viewer.getTable().dispose();
this.viewer = null;
}
this.viewer = new TableViewer(composite, SWT.BORDER
| SWT.FULL_SELECTION);
this.viewer.setContentProvider(new FeatureContentProvider());
this.viewer.setLabelProvider(new FeatureLabelProvider());
this.viewer.getTable().setLayoutData(gd);
this.viewer.getTable().setHeaderVisible(true);
this.viewer.getTable().redraw();
this.viewer.refresh();
List<String> columnNames = getColumnNamesForTable();
for (String name : columnNames) {
TableColumn c = new TableColumn(this.viewer.getTable(), SWT.NONE);
c.setText(name);
c.setWidth(100);
}
this.viewer.getTable().redraw();
this.viewer.refresh();
this.viewer.setInput(iterations);
this.composite.layout(true, true);
复合是从动作代码中的表单传递的参数。该表似乎已分配,复合材料的空间也没有显示。
答案 0 :(得分:1)
我会这样做:
在您要添加表格(占位符)的位置创建表单时创建一个空Composite
。在添加表格之前,它将一直可见。
当您需要创建表格时,请处置占位符合成的所有子项(例如,删除以前的表格)
使用占位符合成作为父
Table
创建列并填写表格
在表单(或顶级复合词)上调用layout(true, true)
以显示表格。
修改强>
从我看到的代码中,您至少需要将布局设置为tableComposite
:
tableComposite.setLayout(GridLayoutFactory.fillDefaults().create());
重新布局应该在较高级别完成(可能使用getParent()
一次或多次,直到达到顶级复合,但如果你将它作为一个字段会更好。示例:
this.composite.getParent().layout(true, true);
答案 1 :(得分:0)
上述代码中缺少的是redraw
的{{1}}:
Composite
答案 2 :(得分:0)
更好的解决方案应该是:
1)在表单创建期间添加空表
2)通过将表exclude
的{{1}}属性设置为true,从UI中排除表格
3)需要时在表格中添加列和行
4)将GridData
属性设置为exclude
5)重绘或false
表的容器。