2009-08-05 7 views
2

Eclipseビューでツリーとテーブルに同じコンテンツとラベルプロバイダを使用することができるかどうか、また別のコンテンツプロバイダとラベルプロバイダが必要であるかどうかを知りたいと思います。私はコンテンツとラベルのプロバイダを使用しようとしている私はテーブルのツリーのために書いたが、私はテーブルビューに何も表示されません。Eclipse:ツリービューとテーブルビュー

ありがとうございました。

+0

に答えていますか?もしそうなら、答えを受け入れてください。そうでなければ、あなたの質問を明確にしてください。ありがとうございます –

答えて

2

同じラベルプロバイダを使用できます。

ツリーコンテンツプロバイダは、テーブルコンテンツプロバイダによって実装される必要があるIStructuredContentProviderインターフェイスと「互換性がない」ITreeContentProviderを実装する必要があるため、同じコンテンツプロバイダを使用することはできません。

"互換性がありません"というのは、TreeContentProviderのIStructuredContentProvider.getElements(Object inputElement)メソッドの実装は、リストコンテンツプロバイダのすべてのオブジェクトを返す必要があるのに対し、 "root"オブジェクトのみを返す必要があることを意味します。

0

プロバイダを共有できます。 ContentProviderはIStructuredContentProviderとITreeContentProviderの両方を実装する必要があります。私は通常、あなたは別々のコンテンツプロバイダを持つことを望んでいると思います。

この例では、ツリーに要素が1つだけ表示されます(すべての要素はルートです)。表には1行しか表示されません。

例:あなたの質問は以下の

//ContentProvider for Tree and Table 
public static class CommonContentProvider extends ArrayContentProvider 
     implements ITreeContentProvider { 

    @Override 
    public Object[] getChildren(final Object arg0) { 
     return null; 
    } 

    @Override 
    public Object getParent(final Object arg0) { 
     return null; 
    } 

    @Override 
    public boolean hasChildren(final Object arg0) { 
     return false; 
    } 
} 

public static void testCommonProviderTreeTable(final Composite c) { 
    final Collection<String> input = Arrays.asList(new String[] { "hi", 
      "hola" }); 
    final IContentProvider contentProvider = new CommonContentProvider(); 
    final IBaseLabelProvider labelProvider = new LabelProvider() { 
     @Override 
     public String getText(final Object element) { 
      return element.toString(); 
     } 
    }; 
    final TreeViewer tree = new TreeViewer(c, SWT.NONE); 
    tree.setContentProvider(contentProvider); 
    tree.setLabelProvider(labelProvider); 
    tree.setInput(input); 

    final TableViewer table = new TableViewer(c, SWT.NONE); 
    table.setContentProvider(contentProvider); 
    table.setLabelProvider(labelProvider); 
    table.setInput(input); 
} 
+0

ビューアが破棄された場合、そのラベルプロバイダのdispose()メソッドが呼び出されます。例えば、DecoratingLabelProviderはこのメソッドを実装してイメージを破棄します。 複数のビューアで同じLabelProviderインスタンスを再利用することはできませんが、このビューアは同時に削除されません。 – ftl

関連する問題