如何设置Eclipse / RCP装饰器的颜色?

时间:2011-02-04 12:04:42

标签: java eclipse rcp

我通过 plugin.xml 将Eclipse / RCP应用程序中的装饰器添加到我的树查看器项目中:

<extension point="org.eclipse.ui.decorators">
      <decorator
            adaptable="true"
            class="sernet.verinice.samt.rcp.TopicDecorator"
            id="sernet.verinice.samt.rcp.TopicDecorator"
            label="ISA Topic decorator"
            lightweight="true"
            location="BOTTOM_LEFT"
            state="true">
         <enablement>
            <objectClass name="sernet.verinice.model.samt.SamtTopic"/>        
         </enablement>
      </decorator>

在装饰器类中,我设置了装饰后缀,工作正常:

public class TopicDecorator extends LabelProvider implements ILightweightLabelDecorator, {
  ControlMaturityService maturityService = new ControlMaturityService();    
  @Override
  public void decorate(Object element, IDecoration decoration) {
     decoration.addSuffix( new StringBuilder().append(" [")
       .append(maturityService.getWeightedMaturity((IControl)element))
       .append("]").toString() );   
     decoration.setForegroundColor(new Color(Display.getCurrent(), 150,90,90));     
   }

正如你所看到的,我也尝试设置没有效果的suffic的前景色。后缀与树中的标签颜色相同:黑色。

如何设置装饰后缀的颜色?

5 个答案:

答案 0 :(得分:3)

我刚刚使用包含IStyledLabelProviderILabelDecorator的{​​{3}}获得了不同颜色的文字装饰。

我认为关键是getStyledText的{​​{1}}方法,它允许自定义文本样式

答案 1 :(得分:1)

我猜您应该尝试更改顺序 - 首先设置setForegroundColor()然后添加后缀。

提示:要不自己初始化任何颜色,可以使用Display.getDefault()。getSystemColor(SWT.COLOR_GREEN);然后你需要关心处理这种颜色 - 它被系统释放。

答案 2 :(得分:1)

如果需要提供各种颜色,装饰者需要实现org.eclipse.jface.viewers.IColorDecorator

答案 3 :(得分:1)

我使用TreeElementDecoratingLabelProvider的包装器类org.eclipse.jface.viewers.DecoratingLabelProvider成功获得了不同颜色的文本装饰:

public class TreeElementDecoratingLabelProvider extends DecoratingLabelProvider {
   public TreeElementDecoratingLabelProvider(ILabelProvider provider,   ILabelDecorator decorator) {
      super(provider, decorator);
   }

    @Override
    public Color getForeground(Object element) {
      //return your color for element...
      return Display.getDefault().getSystemColor(SWT.COLOR_GRAY);
   }
}

答案 4 :(得分:1)

您只需要在org.eclipse.jface.viewers.IColorProvider中实现LabelProvider

public class MyLabelProvider extends LabelProvider implements IColorProvider {

    public String getText(Object element){
        return String.valueOf(element)
    }

    public Color getForeground(Object element){
        Display display = Display.getDefault();
        return display.getSystemColor(SWT.COLOR_GRAY);
    }

    public Color getBackground(Object element){
        return null;
    }
}

然后您可以创建一个DecoratingLabelProvider。通常,您使用工作台的装饰器,因为它会检测到扩展点org.eclipse.ui.decorators注册的装饰器。参见The Java Developer's Guide to Eclipse

ILabelProvider baseLabelProvider = new MyLabelProvider();
IDecoratorManager decoratorManager = PlatformUI.getWorkbench().getDecoratorManager();
ILabelDecorator decorator = decoratorManager.getLabelDecorator();
DecoratingLabelProvider decoratingLabelProvider = new DecoratingLabelProvider(baseLabelProvider, decorator);

并正常使用

TableViewer viewer = ...;
viewer.setLabelProvider(decoratingLabelProvider);

DecoratingLabelProvider自动检测它使用的LabelProvider是否为

有关更复杂的装饰,请查看WorkbenchLabelProvider

我经常将WorkbenchLabelProviderDelegatingStyledCellLabelProvider结合使用,因为它们与工作台完美集成。

我看到这种方法有两个好处:

  1. WorkbenchAdapterLableProvider更容易使用
  2. WorkbenchLabelProvider为您管理Color之类的系统资源。 因此,不要忘记处理WorkbenchLabelProvider

这是我经常使用的代码段:

ILabelDecorator labelDecorator = PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator();
DecoratingStyledCellLabelProvider labelProvider = new DecoratingStyledCellLabelProvider(
            new WorkbenchLabelProvider(), labelDecorator, null);
tableViewer.setLabelProvider(labelProvider);
tableViewer.getTable().addDisposeListener((e) -> labelProvider.dispose());