在Eclipse RCP应用中为Project Explorer添加标签装饰
问题解决:Eclipse RCP自定义标签提供者丢失装饰颜色
问题背景
我们在Eclipse RCP应用中进行UI翻新,将默认图标替换为自定义图标。通过扩展为Project Explorer添加自定义标签提供者后,出现了装饰颜色丢失的问题:
- SVN检出项目不再显示「首选项>颜色>基础>装饰颜色」中设置的黄色仓库名称装饰
- Java资源(如数据类型、方法返回类型)的颜色装饰也完全缺失
当前Common Navigator默认使用的标签提供者是org.eclipse.ui.internal.navigator.NavigatorDecoratingLabelProvider,我们自定义的标签提供者实现如下:
public class CustomLabelProvider extends LabelProvider implements ILabelProvider, ICommonLabelProvider
由于无法直接继承默认的装饰标签提供者,需要为自定义类添加装饰能力。
解决方案
1. 利用DecoratorManager实现文本装饰
Eclipse的DecoratorManager会自动获取所有适用的装饰器并应用装饰,我们可以在自定义标签提供者中调用它的decorateText方法来恢复颜色装饰。
2. 重写getText方法示例
import org.eclipse.ui.internal.decorators.DecoratorManager; import org.eclipse.ui.IDecorationContext; import org.eclipse.ui.PlatformUI; public class CustomLabelProvider extends LabelProvider implements ILabelProvider, ICommonLabelProvider { @Override public String getText(Object element) { // 获取自定义逻辑下的原始文本(替换为你的业务文本逻辑) String originalText = super.getText(element); // 获取DecoratorManager实例 DecoratorManager decoratorManager = DecoratorManager.getInstance(); // 创建默认装饰上下文 IDecorationContext context = PlatformUI.getWorkbench().getDecorationManager().createDefaultDecorationContext(); // 应用所有注册的装饰器 String decoratedText = decoratorManager.decorateText(originalText, element, context); return decoratedText != null ? decoratedText : originalText; } // 保留你的自定义图标替换逻辑 @Override public Image getImage(Object element) { // 此处编写自定义图标获取逻辑,返回对应自定义Image // 示例:return CustomImageRegistry.getImageForElement(element); return super.getImage(element); } }
3. 图标装饰补充(可选)
如果需要保留图标上的叠加装饰(如SVN状态图标),可以在getImage方法中同样调用装饰逻辑:
@Override public Image getImage(Object element) { // 获取自定义图标 Image customImage = // 你的自定义图标获取逻辑 // 应用图标装饰 DecoratorManager decoratorManager = DecoratorManager.getInstance(); IDecorationContext context = PlatformUI.getWorkbench().getDecorationManager().createDefaultDecorationContext(); Image decoratedImage = decoratorManager.decorateImage(customImage, element, context); return decoratedImage != null ? decoratedImage : customImage; }
关键说明
DecoratorManager会自动匹配所有已注册的装饰器(包括SVN资源装饰器、Java语法装饰器等),无需手动逐个调用- 确保
getText和getImage方法都正确调用装饰逻辑,避免只恢复文本或只恢复图标装饰
内容的提问来源于stack exchange,提问作者fjord
相关产品推荐
相关产品推荐

