我是 SWT/JFace 技术的新手,我发现了一个让我发疯的问题。在 Eclipse RCP 应用程序中,我有一个视图,其中放置了一个带有 JFace TreeViewer 的 SWT 树,它通过标签提供程序提供标签和图标。根据客户要求,树的底色为深蓝色,字体颜色为白色。This combination of colours results in a bad visualization of a node's text when the node is selected, the text does not fit the tree region and we place the mouse pointer over the node. 不知何故,出现了“本机突出显示”。这可以在下图中显示。
另一方面,当我们放置鼠标的节点未被选中时,不会发生此问题。突出显示会更改字体的颜色以使其更明显。这可以在下图中显示。
在做了一些研究之后,我发现通过为事件添加一个监听器,SWT.EraseItem
我可以修改所选节点的背景颜色,然后禁用选择。这使我可以定义自己的选择背景样式,并禁用 的SWT.SELECTED
标志,event.detail
以强制操作系统在未选择节点时突出显示。
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 将树节点的图标绘制在错误的位置,如下图所示。
树的根节点的突出显示是完全错误的。如下图所示,节点似乎以两种不同的方式突出显示,并且重复了图标。
我的问题基本上是两个。
您认为主要问题有更简单的解决方案吗?我想要以与第二张图像相同的方式显示选定的节点(第一张图像中的那个)。我想更改所选节点的前景色以使其更明显。
如果使用该
SWT.EraseItem
方法,有没有办法在正确的位置显示图标?这种行为是已知的错误吗?
提前致谢。