2扇窗格。一個是3級TreeViewer
,另一個是TableViewer
。在TreeViewer
和TableViewer
顯示所有可用的第一級對象的列表中選擇它時,沒有項目被選中。爲了實現這一目標,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);
}
});`
這樣當用戶選擇了firstLevelItem
的TableViewer
示出相應的數據。所有調用的方法遵循下面的模式:
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。
是的!你釘它Behnil。非常感謝你! – Martin
我很高興它的工作。那麼你應該接受答案。 – Behnil