2012-12-13 24 views
2

2扇窗格。一個是3級TreeViewer,另一個是TableViewer。在TreeViewerTableViewer顯示所有可用的第一級對象的列表中選擇它時,沒有項目被選中。爲了實現這一目標,TreeViewerContainer實例化TableViewerContainer,然後調用其showFirstLevelItemList()方法:Tableviewer refresh()不起作用。僅在調整窗口大小後才顯示數據。

public class TableViewerContainer { 
private Table table; 
private TableViewer tableViewer; 
private TableColumnLayout layout; 

public TableViewerContainer(SashForm sashForm) { 

    Composite composite = new Composite(sashForm, SWT.NONE); 
    composite.setLayout(new GridLayout(1, false));  
    tableViewer = new TableViewer(composite, SWT.BORDER 
      | SWT.FULL_SELECTION); 
    table = tableViewer.getTable(); 
    table.setHeaderVisible(true); 
    table.setLinesVisible(true); 

    // Add TableColumnLayout 
    layout = new TableColumnLayout(); 
    composite.setLayout(layout); 
} 

public void showFirstLevelItemList(FirstLevelItemListContainer obj) { 
    // Add the only column 
    TableViewerColumn tableViewerColumn = new TableViewerColumn(
      tableViewer, SWT.NONE); 
    TableColumn tblclmnFirst = tableViewerColumn.getColumn(); 

    layout.setColumnData(tblclmnFirst, new ColumnWeightData(10, 
      ColumnWeightData.MINIMUM_WIDTH, false)); 

    tblclmnFirst.setText("Description"); 

    // assign providers and show the table 
    tableViewer.setLabelProvider(new FirstLevelItemLabelProvider()); 
    tableViewer.setContentProvider(new FirstLevelItemContentProvider()); 
    tableViewer.setInput(obj);  
} 

這工作得很好。

接下來,選擇TreeViewer中的項目將導致tableViewer相應地更新數據。爲了實現這一點,我加入SelectionChangedListener()

treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { 
     public void selectionChanged(SelectionChangedEvent event) { 
      IStructuredSelection selection = (IStructuredSelection) event 
        .getSelection(); 
      Object obj = selection.getFirstElement(); 
      if (obj instanceof firsLevelDetail) { 
       FirstLevelDetail fld = (FirstLevelDetail) obj; 
       tableViewer.showFirstLevelDetail(fld);    

      } else if (obj instanceof SecondLevelDetail) 
       SecondLevelDetail sld = (SecondLevelDetail) obj; 
       tableViewer.showSecondLevelDetail(sld);    

      else if (obj instanceof ThirdLevelDetail) 
      ThirdLevelDetail tld = (ThirdLevelDetail) obj; 
       tableViewer.showSecondLevelDetail(tld); 
     } 
    });` 

這樣當用戶選擇了firstLevelItemTableViewer示出相應的數據。所有調用的方法遵循下面的模式:

private void showFirstLevelDetail(FirstLevelDetailObj obj) { 

    Table tbl = tableViewer.getTable(); 
    tbl.setRedraw(false); 

    // Dispose former columns 
    while (tbl.getColumnCount() > 0) { 
     tbl.getColumns()[0].dispose(); 
    } 

    // add new columns 
    TableViewerColumn tableViewerColumn = new TableViewerColumn(
      tableViewer, SWT.NONE); 
    TableColumn tblclmn = tableViewerColumn.getColumn(); 
    layout.setColumnData(tblclmn, new ColumnWeightData(1, 
      ColumnWeightData.MINIMUM_WIDTH, true)); 
    tblclmn.setText("Code FL Item"); 

    tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE); 
    tblclmn = tableViewerColumn.getColumn(); 
    layout.setColumnData(tblclmn, new ColumnWeightData(1, 
      ColumnWeightData.MINIMUM_WIDTH, true)); 
    tblclmn.setText("Description FL Item"); 

    tbl.setRedraw(true); 

    // to avoid an Exception 
    tableViewer.setInput(null); 

    // Assign new providers and show the data 
    tableViewer.setLabelProvider(new FirstLevelDetailLabelProvider()); 
    tableViewer.setContentProvider(new FirstLevelDetailContentProvider()); 
    tableViewer.setInput(obj); 
} 

的ContentProviders' getElements()方法按照下面的百通:

public Object[] getElements(Object inputElement) { 
return ((FirstLevelDetail)inputElement).getArrayItems();     
} 

我的問題是這樣的過程後,表不顯示頁眉或任何數據直到它被調整大小。然後,它正常工作,直到選擇了另一個項目,無論該項目是什麼級別。

tableViewer.refresh()不起作用。
tableViewer.getTable().redraw()不起作用。

所有showXxxxLevelDetail()如果他們被稱爲首先,而不是showFirstLevelItemList()方法正常工作,提供tableViewer.setInput(null)被註釋掉。

我正在運行Eclipse Indigo,jface 3.8,Windows XP。

回答

0

我會嘗試打電話給

composite.layout(); 

調用任何這些showXXXLevelDetail()方法之後。

+0

是的!你釘它Behnil。非常感謝你! – Martin

+0

我很高興它的工作。那麼你應該接受答案。 – Behnil

相關問題