SWT Tree和TreeItem:删除或更改展开/折叠指示器的绘图行为

时间:2013-02-23 22:48:17

标签: java macos user-interface drawing swt

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

树中的顶级项目不应该是可选的;他们基本上是标题。只能选择这些项目的子项。因此,我希望UI的行为能够表明这一点;点击其中一个顶级项目应该展开或折叠,但不应在指标之外提供任何类型的视觉反馈,以改变其状态和孩子的能见度变化。

问题似乎是在OS X上,展开/折叠指示器是一个三角形(不知道它是图像还是unicode字符),它指向正确或向下,但也是基于“选择“国家。我已设法覆盖顶级项目的所有相关行为,但箭头更改颜色除外。

  • 我使用SWT.EraseItem监听器来挂钩背景图,这样背景就不会改变颜色。这可以按预期工作。
  • 我使用了SWT.PaintItem侦听器来确保顶级项目中的文本不会改变颜色。这符合预期,但似乎对指标没有任何影响;我甚至尝试重置GC的前景色,但指示灯的颜色仍在变化:

未选中

Not Selected

选择的

Selected and Ugly

我试图做的一些事情,所有这些事都失败了:

  • 只需在指标顶部绘制一个矩形。无论我将PaintListener附加到。

  • ,指标似乎始终位于顶部
  • 在Selection事件类型上使用Listener,检查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;
            }
        }
    });
    

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

我知道很多这种行为与底层本机小部件的行为高度耦合,但我想知道是否有任何方法可以获得我正在寻找的行为,而无需自定义小部件划痕?

1 个答案:

答案 0 :(得分:3)

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

您可以取消选择事件,不允许它被点击。但这可能是一个小小的kludgy实现,特别是对于键导航。

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

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