我在 SWT(没有 JFace)中工作,我正在尝试自定义我正在使用边栏的树的行为。
树中的顶级项目不应该是可选的;他们基本上是标题。只有这些项目的子项应该是可选的。因此,我希望 UI 的行为方式表明这一点;单击这些顶级项目之一应该展开或折叠,但不应在指示器更改其状态和子级可见性更改之外提供任何类型的视觉反馈。
问题似乎是在 OS X 上,展开/折叠指示器是一个三角形(不知道它是图像还是 unicode 字符),要么指向右要么指向下,但也根据“选择”状态。我已经成功地覆盖了顶级项目的所有相关行为,除了箭头改变颜色。
- 我使用了一个
SWT.EraseItem
监听器来连接到背景绘图,这样背景就不会改变颜色。这按预期工作。 - 我使用了
SWT.PaintItem
监听器来确保顶级项目中的文本不会改变颜色。这按预期工作,但似乎对指标没有任何影响;我什至尝试过不重置 GC 的前景色,但指示器的颜色仍然发生变化:
未选择:
已选择
我尝试做的一些事情都失败了:
只需在指标顶部绘制一个矩形。无论我将 PaintListener 附加到什么,指示器似乎总是在顶部。
在 Selection 事件类型上使用监听器,检查
event.item
是否是顶级项目之一,然后摆弄事件位和重绘标志。这似乎根本行不通;这种行为是完全不可预测的。代码看起来像这样:sideBar.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { TreeItem eventItem = (TreeItem) event.item; if(sideBarRoots.contains(event.item)) { event.detail = 0; event.type = 0; event.doit = false; sideBar.setRedraw(false); } else { sideBar.setRedraw(true); event.type = SWT.Selection; event.doit = true; } } });
由于重绘标志只是一个提示,有时它会被正确设置而其他人则不会。它可以没有任何效果,也可以锁定在边栏中没有任何内容重绘的状态。
我知道很多这种行为与底层 native 小部件的行为高度耦合,但我想知道是否有任何方法可以在不从中滚动自定义小部件的情况下获得我正在寻找的行为从头开始?
最佳答案
我认为在您这样的情况下,理想情况下您应该不允许在树头上进行选择。
您可以通过不允许点击来取消选择事件。但这可能有点笨拙,尤其是对于按键导航。
如果可能的话,更安全的方法是在选择树父节点时移动选择。所以它应该像这样工作,如果通过键盘或鼠标选择了父节点:您展开节点并将选择移动到第一个子节点。
这样你就可以避免所有隐藏选择状态的绘画技巧。
关于java - SWT 树和 TreeItem : Remove or change the drawing behavior of the expand/collapse indicator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15046620/