2011-05-24 182 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

相关问题