You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:42:20