2012-11-13 42 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表的容器。