2011-05-24 188 views
0

我正在開發一個當前有2個視圖的Eclipse插件。在我的第一個視圖中,我有一個在TableViewer(名稱和連接狀態)中顯示的連接列表。在我的第二個視圖中,我想要將表加載到數據庫(連接)中。通過單擊連接上的菜單項(「查看詳細信息」)來完成此加載。這些表格將顯示在TreeViewer中,因爲他們也可以有孩子。我試圖做這種方式:基於Eclipse插件中另一個視圖呈現視圖

我的視圖類:

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類:

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

在我ContentProvider類:

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

呵呵。好的,你在這裏做的是......不是真正正確的方式。你應該做的是註冊你的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); 
    } 

現在你的樹查看器的輸入將根據什麼是在表查看器中選擇改變(順便說一句,不要忘記在設置新輸入後調用treeviewer.refresh())。

查看示例here

+0

是的,似乎是正確的方式來做我的情況。但是現在我一直在調試,看起來TreeView上的createPartControl在打開它時根本不會被調用!我似乎無法想象爲什麼會發生這種情況......只要我弄清楚發生了什麼,我會嘗試你的建議。 – AndaP 2011-05-24 11:46:57

+0

是的,我想,但是第一個視圖被調用,而第二個視圖不被調用。我在啓動/第一次打開視圖時在它們中都放置了斷點 – AndaP 2011-05-24 12:42:02

+0

@Azshara - 如果已經創建了視圖,則不會調用createPartControl。因此,例如,如果您從一個角度打開視圖,然後切換到另一個視圖並在那裏打開視圖,則該方法不會再被調用。 – Sandman 2011-05-24 12:50:35

相關問題