【问题标题】:Java/SWT mouse hover/click over a column of a tree viewerJava/SWT 鼠标悬停/单击树查看器的列
【发布时间】:2014-10-06 13:31:21
【问题描述】:

我有一个TreeViewer,其中一些单元格的样式看起来像链接。树中充满了内容提供者和StyledCellLabelProviders。我需要知道那些特定的“链接”单元格何时悬停(所以我将鼠标更改为手形光标)并单击(所以我实际上对这些“链接”做了一些事情)。

我未能找到解决方案,因此我们将不胜感激。

谢谢, 奥伦

编辑:更多解释 我有一棵树和一个treeviewer。有 4 个TreeColumns,每个都有一个TreeViewerColumn。数据填充有内容提供程序和 2 种类型的标签提供程序(用于简单文本和样式文本)。我需要知道鼠标何时单击第 4 列中的某个项目以及何时将鼠标悬停在该项目上。发生这种情况时 - 我需要知道它被单击的单元格、它属于哪个 TreeItem、该项目中的数据等。

我的问题是我想不通。当我使用鼠标侦听器或选择侦听器时,它们仅适用于第一列。我无法“到达”第四个。

我无法更改列顺序,否则将没有意义。

有什么想法吗?

【问题讨论】:

    标签: java hover swt jface treeviewer


    【解决方案1】:

    我会采用这种方法:

    1. 将MouseMoveListener 附加到树

    2. 用Tree.getItem(Point)确定鼠标指针在哪个TreeItem上。

      对于多列树,getItem() 只会在鼠标位置在第一列内时返回一个项目。使用 SWT.FULL_SELECTION 样式标志创建树,或使用类似的解决方法来确定项目:

      TreeItem item = tree.getItem(new Point(event.x, event.y));
      int x = 0;
      while (item == null) {
        item = tree.getItem(new Point(x, event.y));
        x += 5;
      }
      

      如果找不到项目,可能需要添加更多条件(例如x < tree.getBounds().x)以防止无限循环。

    3. 一旦你有了TreeItem,你就可以得到它用TreeItem::getData 显示的元素。请注意,这是TreeViewer 的实现细节 - 但我不知道还有另一种方法可以获取给定TreeItem 的元素。

    【讨论】:

    • 我的 TreeItem 每列有 4 列,我不知道为什么,但我使用内容查看器创建它们,我相信顶层中的每个 TreeItem 都应该有几个子项(如内容提供者所示),但是在对它们进行迭代时不显示它们。所以我不确定我会得到的 TreeItem 是否正确。我会尝试并在这里更新。
    • 更新:我刚刚试了一下,只有鼠标悬停在第一列才能得到TreeItem。将鼠标悬停在其他列上时我不明白。有什么想法吗?
    • @OrenSarid 我已经用我发现的关于多列树 HTH Rüdiger 的信息更新了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多