Java 不同 ViewParts 中的 Eclipse IStructuredSelection returns null

Java Eclipse IStructuredSelection in different ViewParts returns null

起初我在 Whosebug 上查看了关于 IStructuredSelection 的其他主题,但它们并没有解决我的问题。

所以我有 2 个视图。在这两个视图中,我都有一个 TreeViewer 并实现了 getSite().setSelectionProvider(viewer);

在 MainView 中,当我单击 TreeNode注意: 这些 TreeNode 来自自定义 class,假设 myTreeNode) PropertiesView 得到更新,我的弹出窗口 menu 与不同的处理程序调用正确的函数。

其中一个函数在另一个 View 中创建一个新的 TreeItem,它应该在不同的列中显示一些值。这些值每秒更新一次。这部分也能正常工作。

但是现在问题出现了。当我单击其中一个 TreeItem 时,PropertiesView 不会更新,弹出菜单处理程序也无法正常工作。 IStructuredSelection strucSelection = (IStructuredSelection) selection;总是returnsnull.

这是我的 getAdapter 方法,来自我的适配器 PropertiesView:

@Override
public Object getAdapter(Object adaptableObject, Class adapterType)
{
    if(adapterType == IPropertySource.class && adaptableObject instanceof UATreeNode)
        return new UATreeNodeAdapter((UATreeNode) adaptableObject);
    else if(adapterType == IPropertySource.class && adaptableObject instanceof TreeItem)
    {
        MainView.printOnOPCUAConsole(OPCUAConsoleMessageTypeEnum.NULL, "Instanceof TreeItem");
        return new TreeItemAdapter((TreeItem) adaptableObject);
    }
    else if(adapterType == IPropertySheetPage.class)
    {
        if(propertyPage == null)
            propertyPage = new PropertySheetPage();
        return propertyPage;
    }
    return null;
}

这是我的 Handler,当打开第二个视图中的 menu 并执行命令时,应该调用它:

@Override
public Object execute(ExecutionEvent event) throws ExecutionException
{
    ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event).getSelectionService().getSelection();
    if(selection instanceof IStructuredSelection)
    {
        IStructuredSelection strucSelection = (IStructuredSelection) selection;

        if(strucSelection.getFirstElement() != null)
        {
            TreeItem treeItem = (TreeItem) strucSelection.getFirstElement();
            UaSubscription uaSubscription = (UaSubscription) treeItem.getData("uaSubscription");

        }
    }
    return null;
}

在这两种情况下,选择都是空的,但我可以看到选择了一些东西,否则我认为 popup menu 不会显示。

所以我现在的问题是,有人知道如何从我的第二个 View 中获得选择吗?我做错了什么?

好的,我通过实现自己的元素并通过 ContentProvider 将它们提供给 TreeViewer 解决了这个问题。 然后我为 plugin.xml 中的 adapter-extension 添加了一个新的 adaptableType(新创建的 class)并将新的 Class 添加到 adapter-factory.