我是 SWT/JFace 技术的新手,我发现了一个让我抓狂的问题。在 Eclipse RCP 应用程序中,我有一个 View ,我在其中放置了一个带有 JFace TreeViewer 的 SWT 树,它通过标签提供程序提供标签和图标。根据客户要求,树的底色为深蓝色,字体颜色为白色。当节点被选中时,这种颜色组合导致节点文本的可视化效果不佳,文本不适合树区域,我们将鼠标指针放在节点上。不知何故出现了“原生突出显示”。这可以在下图中显示。
另一方面,当我们放置鼠标的节点没有被选中时,这个问题就不会发生。突出显示会更改字体的颜色以使其更加明显。这可以在下图中显示。
在做了一些研究之后,我 found通过为 SWT.EraseItem
事件添加一个监听器,我能够修改所选节点的背景颜色,然后禁用该选择。这允许我定义我自己的选择背景样式,并禁用 event.detail
的 SWT.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
添加监听器这一事实(即使没有代码来处理事件)也会产生两个新问题。
这使得 SWT 或 JFace 绘制树节点的图标 如下图所示的错误位置。
树根节点的高亮是完全错误的。如你 可以在下图中看到,该节点似乎突出显示在 2 种不同的方式和重复的图标。
我的问题基本上有两个。
您认为主要问题有更简单的解决方案吗?什么 我想显示一个选定的节点(第一张图片中的一个) 与第二张图片中的方式相同。我想改变 所选节点的前景色,使其更加可见。
如果使用
SWT.EraseItem
方法,有没有办法 在正确的位置显示图标?这种行为是已知的吗? 错误?
提前致谢。
最佳答案
如果您使用基于 StyledCellLabelProvider
的标签提供程序(也许是基于 DelegatingStyledCellLabelProvider
),您可以指定 COLORS_ON_SELECTION
以在选择时保留正常颜色.
如果这还不够好(这里没有 Windows 可以测试),您可以覆盖 paint
方法 - 您可以再次尝试使用 event.detail &= ~SWT.SELECTED
来抑制正常的选择处理,甚至自己处理绘画。
关于java - 突出显示时更改 SWT 树节点文本前景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21278512/