如何在Eclipse RCP中隐藏/移除Preferences对话框的导入导出按钮
原配置无效原因
你之前绑定偏好设置导入向导类的Activity规则不生效,是因为偏好设置对话框底部的导入/导出按钮为硬编码创建,创建时不会校验对应向导的Activity可见性,而是直接关联了全局命令ID,所以仅绑定向导类无法隐藏按钮。
解决方案
方法1:绑定命令的Activity规则(推荐,无代码侵入)
直接绑定按钮对应的两个全局命令ID即可,无需修改对话框逻辑,仅通过扩展点配置实现:
<extension point="org.eclipse.ui.activities"> <activity id="my_hidden_activity" name="禁用偏好设置导入导出功能"> </activity> <!-- 绑定偏好设置导入命令 --> <activityPatternBinding activityId="my_hidden_activity" isEqualityPattern="true" pattern="org.eclipse.ui/org.eclipse.ui.file.importPreferences"> </activityPatternBinding> <!-- 绑定偏好设置导出命令 --> <activityPatternBinding activityId="my_hidden_activity" isEqualityPattern="true" pattern="org.eclipse.ui/org.eclipse.ui.file.exportPreferences"> </activityPatternBinding> </extension>
Activity机制会自动禁用绑定的命令,对应的按钮会自动隐藏。
方法2:监听对话框事件动态隐藏(兼容性更高)
如果有特殊场景需要更灵活的控制,可以通过监听对话框打开事件动态隐藏按钮,不需要重写对话框:
import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.IWindowListener; import org.eclipse.ui.internal.dialogs.WorkbenchPreferenceDialog; // 在插件激活类的start方法中注册监听器即可 PlatformUI.getWorkbench().addWindowListener(new IWindowListener() { @Override public void windowOpened(IWorkbenchWindow window) { window.getShell().getDisplay().addFilter(SWT.Activate, event -> { if (!(event.widget instanceof Shell)) { return; } Shell shell = (Shell) event.widget; Object shellData = shell.getData(); if (!(shellData instanceof WorkbenchPreferenceDialog)) { return; } WorkbenchPreferenceDialog prefDialog = (WorkbenchPreferenceDialog) shellData; Control[] buttonBarChildren = prefDialog.getButtonBar().getChildren(); for (Control child : buttonBarChildren) { if (child instanceof Button) { Button btn = (Button) child; String btnText = btn.getText(); // 适配中英文场景 if (btnText.contains("导入") || btnText.contains("导出") || btnText.contains("Import") || btnText.contains("Export")) { btn.setVisible(false); } } } prefDialog.getButtonBar().layout(); }); } @Override public void windowClosed(IWorkbenchWindow window) {} @Override public void windowActivated(IWorkbenchWindow window) {} @Override public void windowDeactivated(IWorkbenchWindow window) {} });
内容的提问来源于stack exchange,提问作者jcurley
相关产品推荐
相关产品推荐

