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
.
起初我在 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
.