1

我正在使用 SWT(没有 JFace),并且正在尝试自定义使用侧边栏的 Tree 的行为。

树中的顶级项目不应该是可选择的;他们基本上是标题。只有这些项目的子项应该是可选择的。因此,我希望 UI 以表明这一点的方式运行;单击这些顶级项目之一应展开或折叠,但不应在指示器更改其状态和子项的可见性更改之外提供任何类型的视觉反馈。

问题似乎是在 OS X 上,展开/折叠指示器是一个三角形(不知道它是图像还是 unicode 字符),指向右侧或向下,但也根据“选择”状态着色. 我已经设法覆盖了顶级项目的所有相关行为,除了改变颜色的箭头。

  • 我使用了一个SWT.EraseItem监听器来连接背景图,这样背景就不会改变颜色。这按预期工作。
  • 我使用了一个SWT.PaintItem监听器来确保顶级项目中的文本不会改变颜色。这按预期工作,但似乎对指标没有任何影响;我什至尝试过重置 GC 的前景色,但指示器的颜色仍然会发生变化:

未选择

未选中的

已选中

精选和丑陋

我尝试做的一些事情都失败了:

  • 只需在指标顶部绘制一个矩形。无论我将 PaintListener 附加到什么,指示器似乎总是在顶部。

  • 在选择事件类型上使用侦听器,检查是否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;
            }
        }
    });
    

    由于重绘标志只是一个提示,因此有时它会正确设置,而其他情况则不会。它可以没有任何效果,也可以锁定在侧边栏中没有重绘的状态。

我知道很多这种行为与底层本机小部件的行为高度耦合,但我想知道是否有任何方法可以在不从头开始滚动自定义小部件的情况下获得我正在寻找的行为?

4

1 回答 1

3

我认为在您的情况下,理想情况下您应该不允许在树头上进行选择。

您可以取消选择事件,方法是不允许它可点击。但这可能是一个有点笨拙的实现,尤其是对于键导航。

如果可能的话,更安全的方法是在选择树父节点时移动选择。因此,如果通过键盘或鼠标选择了父节点,它应该像这样工作:展开节点并将选择移动到第一个子节点。

这样,您可以避免所有隐藏选择状态的绘画技巧。

于 2013-02-25T06:33:04.680 回答