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

标签 java swt jface treeviewer

我是 SWT/JFace 技术的新手,我发现了一个让我抓狂的问题。在 Eclipse RCP 应用程序中,我有一个 View ,我在其中放置了一个带有 JFace TreeViewer 的 SWT 树,它通过标签提供程序提供标签和图标。根据客户要求,树的底色为深蓝色,字体颜色为白色。当节点被选中时,这种颜色组合导致节点文本的可视化效果不佳,文本不适合树区域,我们将鼠标指针放在节点上。不知何故出现了“原生突出显示”。这可以在下图中显示。

enter image description here

另一方面,当我们放置鼠标的节点没有被选中时,这个问题就不会发生。突出显示会更改字体的颜色以使其更加明显。这可以在下图中显示。

enter image description here

在做了一些研究之后,我 found通过为 SWT.EraseItem 事件添加一个监听器,我能够修改所选节点的背景颜色,然后禁用该选择。这允许我定义我自己的选择背景样式,并禁用 event.detailSWT.SELECTED 标志,以强制操作系统突出显示节点不是已选中。

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;
        }
    }
}

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

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

    enter image description here

  2. 树根节点的高亮是完全错误的。如你 可以在下图中看到,该节点似乎突出显示在 2 种不同的方式和重复的图标。

    enter image description here

我的问题基本上有两个。

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

  2. 如果使用 SWT.EraseItem 方法,有没有办法 在正确的位置显示图标?这种行为是已知的吗? 错误?

提前致谢。

最佳答案

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

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

关于java - 突出显示时更改 SWT 树节点文本前景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21278512/

相关文章:

原始数组写入的 Java 并发可见性

swt - 在节点展开/折叠时更改 JFace TreeViewer 中的标签

java - 循环字符串创建

java - 有没有一种方法可以传递方法的返回值,而在引用时不会执行整个方法?

java - 如何增加SWT对话框标题的字体大小

java - SWT/JFace : How to set max textlength in TableViewerColumn

java - 如何使用 IContentAssist 处理器在自动完成中显示弹出的附加信息

java - 如何在 JFace 向导页面之间传递数据..?

java - 在 JFace ErrorDialog 中使用换行符

java - 在 Keycloak 中创建新用户期间未分配客户端角色