Eclipse rcp 确定视图的哪个实例当前在RCP中处于活动状态?

Eclipse rcp 确定视图的哪个实例当前在RCP中处于活动状态?,eclipse-rcp,rcp,Eclipse Rcp,Rcp,我正在创建一个RCP应用程序。我需要打开同一视图的多个实例,但数据不同。我是通过为同一视图的不同实例设置辅助id来实现的。具体来说,我的问题如下:请看一看 我有一个名为Views.GraphView的图形视图。我通过一个名为openGraphView的命令打开了它的不同实例,以显示不同的图形。命令如下: page.showView("Views.GraphView", Integer.toString(instanceNum++), IWorkbenchPage.VIEW_ACTIVATE);

我正在创建一个RCP应用程序。我需要打开同一视图的多个实例,但数据不同。我是通过为同一视图的不同实例设置辅助id来实现的。具体来说,我的问题如下:请看一看

我有一个名为
Views.GraphView
的图形视图。我通过一个名为
openGraphView
的命令打开了它的不同实例,以显示不同的图形。命令如下:

page.showView("Views.GraphView", Integer.toString(instanceNum++), IWorkbenchPage.VIEW_ACTIVATE);
现在,我在这个
Views.GraphView
工具栏上有一个名为
TreeLayout
的命令,它假设要更改图形的布局,并将对视图的每个实例进行操作。但对于这个,我认为,我需要确定视图的哪个实例是活动的。
TreeLayout
命令如下所示:

IViewPart findView =  HandlerUtil.getActiveWorkbenchWindow(event).getActivePage(). findView( "Views.GraphView"); //I think in the findView I need to give the id of the view [but how can I put the secondary id?]

GraphView view = (GraphView) findView;
view.changeLayout();  //I wrote this method in the graph view to change the layout 

//I just tried to print the secondary id, but it did not print anyting
System.out.println("From treelayout command:- " + view.getViewSite().getSecondaryId());
因此,如何识别视图的哪个实例当前处于活动状态并对其进行操作?

如果返回null,则可以使用当前透视图中不存在具有viewId和viewId的视图

如果您有ViewReference,则可以使用它来获取视图

因此,在你的处理程序中,你会得到如下结果:

final IWorkbenchPage page = HandlerUtil.getActiveWorkbenchWindow(
                    event).getActivePage();
final int instanceNum = 8;//the number of instances that are created
for (int index = 0; index < instanceNum; index++) {
    final IViewReference viewReference = page.findViewReference(
                        "Views.GraphView", Integer.toString(index));
    if (viewReference != null) {
        final IViewPart view = viewReference.getView(true);
        if (view instanceof GraphView) {
            final GraphView graphView = (GraphView) view;
            graphView.changeLayout();
        }
    }
}
final IWorkbenchPage=HandlerUtil.getActiveWorkbenchWindow(
getActivePage();
最终int instanceNum=8//创建的实例数
对于(int index=0;index
如果返回null,则可以使用viewId和viewId的视图在当前透视图中不存在

如果您有ViewReference,则可以使用它来获取视图

因此,在你的处理程序中,你会得到如下结果:

final IWorkbenchPage page = HandlerUtil.getActiveWorkbenchWindow(
                    event).getActivePage();
final int instanceNum = 8;//the number of instances that are created
for (int index = 0; index < instanceNum; index++) {
    final IViewReference viewReference = page.findViewReference(
                        "Views.GraphView", Integer.toString(index));
    if (viewReference != null) {
        final IViewPart view = viewReference.getView(true);
        if (view instanceof GraphView) {
            final GraphView graphView = (GraphView) view;
            graphView.changeLayout();
        }
    }
}
final IWorkbenchPage=HandlerUtil.getActiveWorkbenchWindow(
getActivePage();
最终int instanceNum=8//创建的实例数
对于(int index=0;index
view.getViewSite().getSecondaryId()方法是识别次视图的好方法。此方法仅返回“主”视图的空字符串:当用户单击“窗口->显示视图-您的视图”时打开的视图

我不明白为什么视图工具栏按钮必须在所有视图实例上操作。在我看来,每个视图实例工具栏中应该有一个按钮,仅在其自己的视图中操作。如果您真的需要从一个按钮操作所有视图,我认为您必须自己保留打开的视图引用,因为我认为工作台没有提供返回视图数组的findViews方法。

view.getViewSite().getSecondaryId()
方法是识别次视图的好方法。此方法仅返回“主”视图的空字符串:当用户单击“窗口->显示视图-您的视图”时打开的视图


我不明白为什么视图工具栏按钮必须在所有视图实例上操作。在我看来,每个视图实例工具栏中应该有一个按钮,仅在其自己的视图中操作。如果您真的需要从一个按钮操作到所有视图,我认为您必须自己保留打开的视图引用,因为我认为工作台没有提供返回视图数组的FindView方法。

使用下面的代码,您应该能够获得当前的活动视图

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart()

使用以下代码,您应该能够获得当前活动视图

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart()
活动视图和编辑器名称显示在MessageDialogbox上

我希望这个答案是有用的

活动视图和编辑器名称显示在MessageDialogbox上


我希望这个答案有用。

嗨,非常感谢你的回复。我尝试了你的代码,但不幸的是它没有工作。如果打开图形视图的两个或多个实例,则该命令仅适用于最后一个实例,而不适用于前一个实例。你能提供更多的信息吗。谢谢,Syeed我的第一个想法是page.findViewReference只返回活动viewpart的viewreference。你能调试以确认这一点吗?嗨,我调试代码。page.findViewReference返回对当前打开的所有视图实例的引用(无论当前选择了哪个视图实例)。但该引用仅适用于视图的最后一个实例(在我的示例中,changeLayout()适用于最后一个实例)。此外,如果关闭视图的最后一个实例,它仍然无法用于以前的视图实例。请提供一些解决方案-SyeedHi,非常感谢您的回复。我尝试了你的代码,但不幸的是它没有工作。如果打开图形视图的两个或多个实例,则该命令仅适用于最后一个实例,而不适用于前一个实例。你能提供更多的信息吗。谢谢,Syeed我的第一个想法是page.findViewReference只返回活动viewpart的viewreference。你能调试以确认这一点吗?嗨,我调试代码。page.findViewReference返回对当前打开的所有视图实例的引用(无论当前选择了哪个视图实例)。但该引用仅适用于视图的最后一个实例(在我的示例中,changeLayout()适用于最后一个实例)。此外,如果关闭视图的最后一个实例,它仍然无法用于以前的视图实例。请提供一些