【问题标题】:Render view based on another view in Eclipse plugin基于 Eclipse 插件中的另一个视图渲染视图
【发布时间】:2016-04-01 23:43:07
【问题描述】:

我正在开发一个当前有 2 个视图的 Eclipse 插件。在我的第一个视图中,我有一个显示在TableViewer 中的连接列表(名称和连接状态)。在我的第二个视图中,我想将表加载到数据库中(连接)。此加载将通过单击连接上的菜单项来完成(“查看详细信息”)。这些表将显示在TreeViewer 中,因为它们也可以有子表。我试过这样做:

我的视图类:

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);

单击菜单项时,树视图中也没有任何反应。有任何想法吗? 谢谢

【问题讨论】:

    标签: eclipse eclipse-plugin swt jface


    【解决方案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

    【讨论】:

    • 是的,对于我的情况来说,这似乎是正确的方法。但是现在我一直在调试,当我打开它时,似乎根本没有调用 TreeView 上的 createPartControl!我似乎无法想象为什么会发生这种情况......一旦我弄清楚发生了什么,我会尝试你的建议。
    • 是的,我想通了,但是第一个视图的那个被调用了,而第二个视图的那个没有被调用。我在启动时/第一次打开视图时在它们两个中都设置了断点
    • @Azshara - 如果视图已创建,则不会调用 createPartControl。因此,例如,如果您在一个透视图中打开视图,然后切换到另一个并在那里打开它,则不会再次调用该方法。
    猜你喜欢
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多