2

2サッシサッシフォーム。一方に3レベルTreeViewer、もう一方にa TableViewerTreeViewer 起動すると、でアイテムが選択されておらず、TableViewer使用可能なすべての第1レベルのオブジェクトのリストが表示されます。これを実現するために、を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原因でアイテムを選択すると、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、WindowsXPを実行しています。

4

1 に答える 1

0

電話してみます

composite.layout();

それらのshowXXXLevelDetail()メソッドのいずれかを呼び出した後。

于 2012-12-14T00:37:06.527 に答える