Eclipse rcp 自定义透视切换器工具栏:如何动态更新它?

Eclipse rcp 自定义透视切换器工具栏:如何动态更新它?,eclipse-rcp,toolbar,perspective,Eclipse Rcp,Toolbar,Perspective,我正在尝试实现一个定制的透视切换器工具栏来取代eclipse的内置工具栏。我无法显示工具栏,并且由于菜单贡献中的t,我必须使用控件元素,如中所述 我有一个按照这种方法显示的工具栏,但我不知道如何动态更新它。解决方法说明是从myWorkbenchControlContributionItem的更新方法调用ContributionItem#fill(CoolBar,int),而不是在createControl方法中进行填充 我不知道谁应该调用update,但无论我做什么,它都不会被调用。我有一个透视

我正在尝试实现一个定制的透视切换器工具栏来取代eclipse的内置工具栏。我无法显示工具栏,并且由于菜单贡献中的t,我必须使用控件元素,如中所述

我有一个按照这种方法显示的工具栏,但我不知道如何动态更新它。解决方法说明是从my
WorkbenchControlContributionItem
的更新方法调用
ContributionItem#fill(CoolBar,int)
,而不是在
createControl
方法中进行填充

我不知道谁应该调用
update
,但无论我做什么,它都不会被调用。我有一个透视监听器,它知道何时更新工具栏,因此从该监听器的回调中,我调用
fill(CoolBar,int)
。但是我不确定如何将
CoolBar
传递给该方法,所以我在当前shell上创建了一个

所有这一切的最终结果是,工具栏最初显示正确数量的项目,但当我需要添加项目时,它没有任何效果。我调用
fill(CoolBar,int)
并将新项目添加到工具栏,但我尝试使
CoolBar
toolbar
更新的一切都不起作用。当我重新启动应用程序时,工具栏上会添加一个项目

我肯定我做错了,但我想不出正确的方法。这里是我代码的省略表示(省略与更新问题无关的方法、布局代码等)

公共类透视切换器工具栏扩展工作台Windows控制贡献实现IPerspectiveListener{
...
@凌驾
受保护的控件createControl(复合父级){
this.parent=parent;
IWorkbenchPage=PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
page.getWorkbenchWindow().addPerspectiveListener(此);
toolBarManager=(toolBarManager)parent.getParent().getData();
fTopControl=新组合(父级,SWT.BORDER);
填充(新的冷却条(page.getWorkbenchWindow().getShell(),SWT.HORIZONTAL),-1);
返回控制;
}
@凌驾
公共空白填充(CoolBar CoolBar,int索引){
IPerspectiveDescriptor[]openPerspectives=page.getOpenPerspectives();
字符串ActivePerspectiveId=getPerspectiveId();
工具栏=新工具栏(fTopControl,SWT.NONE);
for(IPerspectiveDescriptor:openPerspectives){
ToolItem=新的ToolItem(工具栏,SWT.RADIO);
//这里太夸张了,试图找到一些方法来升级工具栏
toolbar.update();
parent.update();
父布局(true);
parent.getParent().update();
parent.getParent().layout(true);
coolbar.布局(真实);
}
//透视侦听器回调
@凌驾
public void透视激活(IWorkbenchPage页面,IPerspectiveDescriptor透视){
填充(新的冷却条(page.getWorkbenchWindow().getShell(),SWT.HORIZONTAL),-1);
if(page.getWorkbenchWindow()WorkbenchWindow实例){
//这个非API调用也没有帮助
((WorkbenchWindow)page.getWorkbenchWindow()).updateActionBars();
}
}
...
}

您可能需要重写
isDirty
和/或
isDynamic
方法。谢谢。我本应该显示它,但我让isDynamic返回true。我刚才尝试重写isDirty以返回true,得到了相同的结果。我应该提到,以编程方式选择一个工具栏项目也不会呈现。