表查看器刷新() 不起作用.仅显示调整窗口大小后的数据



一个 2 扇形的腰带形式。一个是 3 级TreeViewer,另一个是TableViewer。当它启动时,不会在TreeViewer中选择任何项目TableViewer显示所有可用第一级对象的列表。为了实现这一点,TreeViewerContainer实例化TableViewerContainer,然后调用其showFirstLevelItemList( )方法:

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中选择一个项目会导致表查看器相应地更新数据。为了实现这一点,我添加了一个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);
}

内容提供商的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。

我会尝试调用

composite.layout();

在调用任何这些 showXXXLevelDetail() 方法之后。

最新更新