我有一个表单,在表单的一部分中,我对工具栏有一个操作。
运行该操作将导致以动态列和行的形式绘制一张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);
其中composite是从操作代码中的表单传递的参数。该表似乎已分配,并且组合的空间也已分配,但未显示。
最佳答案
我会这样做:
在要添加表格的位置(占位符)的位置创建表单时,创建一个空的Composite
。在添加表之前,它是不可见的。
当您需要创建表时,请处置占位符组合的所有子级(例如,删除以前的表)
使用占位符组合作为父级来创建Table
创建列并填写表格
在表单(或顶级Composite)上调用layout(true, true)
以显示该表。
编辑
从我对您的代码的了解来看,您至少需要为tableComposite
设置布局:
tableComposite.setLayout(GridLayoutFactory.fillDefaults().create());
重新布局应该在较高级别进行(也许使用
getParent()
一次或几次,直到达到最高级别的复合,但最好将其作为字段使用)。例:this.composite.getParent().layout(true, true);
关于java - SWT以表格形式动态绘制表格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13357736/