Eclipse RCP自定义视图如何移除/禁用关闭按钮?
如何在Eclipse RCP中让自定义视图无法关闭(移除关闭按钮)
我在Eclipse RCP应用里定义了一个和Problems视图相邻的自定义视图,希望这个视图始终保持打开状态,不能被关闭,也就是要把视图的关闭按钮禁用或者移除。我的视图类定义如下:
public class ReferencesView extends ViewPart implements ISearchResultViewPart, IPersistable {...}
我试过下面这段代码,但没有效果:
@Override public void init(IViewSite site) throws PartInitException { super.init(site); site.getActionBars().getToolBarManager().remove("org.eclipse.ui.file.close"); }
解决方案
方法1:通过扩展配置直接禁用关闭(推荐)
在plugin.xml的org.eclipse.ui.views扩展点中,给你的视图添加closeable="false"属性,这是最简洁的配置方式:
<extension point="org.eclipse.ui.views"> <view class="com.yourpackage.ReferencesView" id="com.yourpackage.referencesView" name="References View" closeable="false"> </view> </extension>
配置后视图的关闭按钮会直接消失,也无法通过菜单关闭。
方法2:在代码中移除/禁用关闭相关动作
如果配置方式不适用,可以在视图的init方法中,同时移除工具栏和菜单里的关闭动作:
@Override public void init(IViewSite site) throws PartInitException { super.init(site); // 移除视图工具栏的关闭按钮 site.getActionBars().getToolBarManager().remove("org.eclipse.ui.file.close"); // 移除视图右键菜单中的关闭选项 site.getActionBars().getMenuManager().remove("org.eclipse.ui.file.close"); // 禁用窗口菜单中的关闭视图选项 IWorkbenchWindow window = site.getWorkbenchWindow(); if (window != null) { IAction closeAction = window.getActionBars().getMenuManager().find("org.eclipse.ui.file.close"); if (closeAction != null) { closeAction.setEnabled(false); } } }
注:部分Eclipse版本中关闭动作的ID可能为"close",可根据实际情况调整。
方法3:拦截视图关闭事件
如果上述方法都无效,可以通过添加部件监听器拦截关闭请求:
@Override public void createPartControl(Composite parent) { // 你的视图初始化代码 // 添加关闭事件拦截 getSite().getWorkbenchWindow().getPartService().addPartListener(new IPartListener2() { @Override public boolean partClose(IWorkbenchPartReference partRef) { if (partRef.getPart(false) == ReferencesView.this) { // 返回false阻止视图关闭 return false; } return true; } // 实现其他空方法 @Override public void partActivated(IWorkbenchPartReference partRef) {} @Override public void partBroughtToTop(IWorkbenchPartReference partRef) {} @Override public void partClosed(IWorkbenchPartReference partRef) {} @Override public void partDeactivated(IWorkbenchPartReference partRef) {} @Override public void partOpened(IWorkbenchPartReference partRef) {} @Override public void partHidden(IWorkbenchPartReference partRef) {} @Override public void partVisible(IWorkbenchPartReference partRef) {} }); }
内容的提问来源于stack exchange,提问作者ags
相关产品推荐
相关产品推荐

