突出显示时更改SWT树节点文本前景

Ale*_*lez 5 java swt jface treeviewer

我在SWT / JFace技术方面还很陌生,但发现了一个令我抓狂的问题。在Eclipse RCP应用程序中,我有一个视图,其中放置了带有JFace TreeViewer的SWT树,该JFace TreeViewer通过标签提供程序提供标签和图标。根据客户的要求,树的背景颜色为深蓝色,字体颜色为白色。当选择了节点时,这种颜色组合会导致节点文本的可视化效果不佳,文本不适合树形区域,并且我们将鼠标指针放在节点上。以某种方式出现“本机突出显示”。可以在下图中显示。

在此处输入图片说明

另一方面,当未选择将鼠标放在其上的节点时,不会发生此问题。突出显示会更改字体的颜色以使其更加可见。可以在下图中显示。

在此处输入图片说明

经过一些研究,我发现通过为SWT.EraseItem事件添加侦听器,我可以修改所选节点的背景颜色,然后禁用选择。这使我可以定义自己的选择背景样式,还可以禁用的SWT.SELECTED标记,以event.detail在未选择节点时强制OS突出显示。

private final class EraseItemListener implements Listener {

    public void handleEvent(Event event) {
        // Only perform the node highlight when it is selected.
        if ((event.detail & SWT.SELECTED) == SWT.SELECTED) {
            // Modify background, emulate Windows highlighting.

            ...

            // Set Windows that we do not want to draw this item as a selection (we have already highlighted the item in our way).
            event.detail &= ~SWT.SELECTED;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该“解决方案”可能是合理的。我看到的主要缺点是我的选择样式仅适合Windows 7默认视觉主题。对于那些“ Windows经典”或“高对比度”,我会遇到可视化问题。此外(这是最令人讨厌的问题),为SWT.EraseItem(甚至没有代码来处理事件)添加侦听器的事实产生了两个新问题。

  1. 这使SWT或JFace都可以在错误的位置绘制树节点的图标,如下图所示。

    在此处输入图片说明

  2. 树的根节点的突出显示是完全错误的。如下图所示,该节点似乎以两种不同的方式突出显示,并且重复了该图标。

    在此处输入图片说明

我的问题基本上是两个。

  1. 您是否认为针对主要问题有更简单的解决方案?我想以与第二张图片相同的方式显示一个选定的节点(第一张图片中的一个)。我想更改所选节点的前景色,使其更可见。

  2. 如果使用此SWT.EraseItem方法,是否可以在正确的位置显示图标?此行为是已知错误吗?

提前致谢。

gre*_*449 2

如果您使用基于StyledCellLabelProvider(可能是基于DelegatingStyledCellLabelProvider)的标签提供程序,您可以指定COLORS_ON_SELECTION在选择时保留正常颜色。

如果这还不够好(这里没有 Windows 来测试),您可以重写该paint方法 - 您可以再次尝试使用event.detail &= ~SWT.SELECTED来抑制正常的选择处理,甚至自己处理绘制。