2011-05-24 12 views
0

現在、2つのビューを持つEclipseプラグインを開発中です。私の最初のビューでは、TableViewer(名前と接続状態)に表示されている接続のリストがあります.2番目のビューでは、データベース(接続)にテーブルをロードします。このロードは、接続上のメニュー項目をクリックすることによって行われます(「詳細の表示」)。これらのテーブルは子供を持つこともできるので、TreeViewerに表示されます。私は、このようにそれを行うことを試みた:Eclipseプラグインの別のビューに基づくビューのレンダリング

マイViewクラス:

public class DBTreeView extends ViewPart { 

private TreeViewer treeViewer; 
private Connection root = null; 

    public DBTreeView() { 
     Activator.getDefault().setDbTreeView(this); 
    } 

    public void createPartControl(Composite parent) { 
     treeViewer = new TreeViewer(parent); 
     treeViewer.setContentProvider(new DBTreeContentProvider()); 
     treeViewer.setLabelProvider(new DBTreeLabelProvider()); 
    } 

    public void setInput(Connection conn){ 
     root = conn; 
     treeViewer.setInput(root); 
     treeViewer.refresh(); 
    } 
} 

私は、現在選択されている接続で接続ビューでメニュー項目に登録されているアクションから呼び出されsetInput方法を作りました引数:

MViewContentsActionクラス:私のContentProviderクラスで

public void run(){ 
    selectedConnection = Activator.getDefault().getConnectionsView().getSelectedConnection(); 
    Activator.getDefault().getDbTreeView().setInput(selectedConnection);  
} 

public Object[] getChildren(Object arg0) { 
    if (arg0 instanceof Connection){ 
     return ((Connection) arg0).getTables().toArray(); 
    } 
    return EMPTY_ARRAY; 
} 

EMPTY_ARRAYが...空の配列

ここで私が直面してる問題はデバッグモードで、コードのこの作品は何とか実行されなかった場合ということです:

Activator.getDefault().getDbTreeView().setInput(selectedConnection); 

もメニュー項目をクリックするとツリービューで何も起こりません。何か案は? ありがとうございます

答えて

1

Huh。あなたがここでやっていることは、本当に正しい方法ではありません。あなたがしなければならないことは、選択プロバイダとしてTableViewerを登録することです。

getSite().setSelectionProvider(tableViewer); 

そして、選択リスナーを定義し、このようなツリービューアでビューに追加します。

ISelectionListener listener = new ISelectionListener() { 
    public void selectionChanged(IWorkbenchPart part, ISelection sel) { 
     if (!(sel instanceof IStructuredSelection)) 
      return; 
     IStructuredSelection ss = (IStructuredSelection) sel; 
     // rest of your code dealing with checking whether selection is what is 
     //expected and if it is, setting it as an input to    
     //your tree viewer      
     } 
    }; 

    public void createPartControl(Composite parent) { 
    getSite().getPage().addSelectionListener(listener); 
    } 

今すぐあなたの木の視聴者の入力は、テーブルビューアで選択されているものに応じて変更されます(btw、新しい入力を設定した後にtreeviewer.refresh()を呼び出すことを忘れないでください)。

hereの例を参照してください。

+0

ええ、私の場合はそれを行うには正しい方法だと思われます。しかし、今私はデバッグしていると、TreeView上のcreatePartControlは、私がそれを開くと全く呼び出されていないようです!なぜこれが起きているのか想像することはできません...何が起こっているのか分かるとすぐに私はあなたの提案を試みます。 – AndaP

+0

私は考えましたが、最初のビューのものが呼び出され、2番目のビューのものは呼び出されません。起動時に/ビューを最初に開くときに両方にブレークポイントを設定します – AndaP

+0

@Azshara - ビューが既に作成されている場合、createPartControlは呼び出されません。たとえば、ビューをあるパースペクティブで開き、別のパースペクティブに切り替えてそこに開いた場合、このメソッドはもう一度呼び出されません。 – Sandman

関連する問題