2012-11-13 44 views
0

我有一个窗体,在窗体的一部分中,我在工具栏上有一个动作。 运行该操作应导致在具有动态列和行的表单中绘制swt表。SWT以表格的形式动态地绘制表格

问题是,我设法做到这一点的唯一方法是最初创建一个空表,然后将表句柄传递给稍后将填满它的动作。

如果我有操作代码来绘制表格,窗体不会展开(滚动)来显示整个表格。

有没有办法在不创建初始表的情况下实现我想要的?

我已经采用了复合的代码是这样的: 为了创建的形式构造的复合:

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

当复合材料参数从传递行动代码中的表单。该表似乎被分配和复合空间,但没有显示。

回答

1

我会做这样的:

  • 在在您要添加表(占位符)的位置创建表格的创建一个空Composite。在添加表之前,它不会显示。

  • 当你需要创建表,处置占位符复合的所有儿童(除去例如前面表格)

  • 使用占位符复合物作为家长

  • 创建创建Table列并填写表格

  • 调用layout(true, true)在窗体上(或顶层复合)来显示表格。

编辑

从我看到你的代码,你需要至少设置一个布局的tableComposite

tableComposite.setLayout(GridLayoutFactory.fillDefaults().create()); 

而重新布局应在上完成级别(可能会使用getParent()一次或多次,直到达到顶级组合,但如果将它作为字段,则会更好)。例如:

this.composite.getParent().layout(true, true); 
+0

我试过这种方法我创建了一个复合的形式: tableComposite = new Composite(parentComposite,SWT.None); 和我把tableComposite传递给动作。 动作代码是这样的: this.viewer = new TableViewer(composite,SWT.BORDER | SWT.FULL_SELECTION); this.viewer.setContentProvider(new FeatureContentProvider()); \t \t this.viewer.setLabelProvider(new FeatureLabelProvider()); \t \t this.viewer.getTable()。setLayoutData(gd); \t \t this.viewer.getTable()。setHeaderVisible(true); \t \t this.viewer.getTable()。redraw(); \t \t this.viewer.refresh(); thic.composite.layout(true,true) 但是仍然没有显示... – user847988

+0

请在您的问题中发布代码,它会更具可读性。另外,我想你忘了把布局设置为'tableComposite' – Baldrick

+0

好了,我编辑了这个问题。 – user847988

0

什么从上述代码中缺少的是Compositeredraw

this.composite.redraw(); 
0

更好的解决方案应该是:

1)表单创建
期间添加空表 2)通过将表格的GridDataexclude属性设置为真,从UI中排除表格
3)当nee ded将列和行添加到表中
4)将exclude属性设置为false
5)重绘或layout表的容器。