JTreeTable DnD疯狂闪烁的光标

时间:2011-11-23 10:36:30

标签: java swing cursor drag-and-drop jtreetable

我正在使用由我自己的模型支持的Sun示例JTreeTable的略微修改版本。这将是第三个例子(http://java.sun.com/products/jfc/tsc/articles/bookmarks/处的书签)。

除拖放支持外,一切都按预期工作。我想要DnD更像是JTree所提供的。由于JTreeTable是扩展的JTable,因此它提供了JTable.DropLocation类来确定丢弃位置,这些位置在将内容放入JTreeTable的树呈现列时未提供足够的信息(否)路径和无子索引)。我已经通过创建基于DropLocationJTable版本组合的自定义JTree类来解决这个问题。我还修改了由TreeTableCellRenderer实现提供的JTreeTable类的paint方法,以向用户显示这些新信息(她现在能够查看是否将放置新节点)在所选节点之内,之前或之后,如果在树列内,正如您对JTree所期望的那样。)

但是有一个问题。当在树列内呈现放置位置时,鼠标光标会变得疯狂。它出现然后在几毫秒后消失,或者这种情况发生得如此之快,甚至没有显示拖动光标。这也发生在未经修改的Sun的例子中。我完全不知道为什么会这样。在http://www.java.net/node/663106找到了另一个遇到相同问题的人,但是提供的解决方案似乎将组件的放置位置设置为null,并且无法再使用JTreeTable.getDropLocation()方法检索。我需要将它转换为我修改过的DropLocation,然后根据它绘制内容。 我非常接近我的用例的正确解决方案,我可以品尝它。这个光标闪烁的东西是我的唯一障碍。有什么想法吗?

使用Java 1.6。

PS:我已经决定使用自定义JTreeTable而不是其中一个现有组件(例如Netbeans Outline或JXTreeTable),因为它们似乎都受到JTable.DropLocation的影响问题,并且不支持在所选树节点之前或之后(仅在内部)中删除。如果你知道一个提供这种功能的组件,我会很高兴听到它。

1 个答案:

答案 0 :(得分:9)

这听起来像是核心错误#6700748的一种表现形式(无法验证,这种错误的游行需要很长时间才能连接到...)。因此引用了JXTreeTable中的修复:

    /**
     * {@inheritDoc} <p>
     * 
     * Overridden to hack around #766-swingx: cursor flickering in DnD
     * when dragging over tree column. This is a core bug (#6700748) related
     * to painting the rendering component on a CellRendererPane. A trick
     * around is to let this return false. <p>
     * 
     * This implementation applies the trick, that is returns false always. 
     * The hack can be disabled by setting the treeTable's client property
     * DROP_HACK_FLAG_KEY to Boolean.FALSE. 
     * 
     */
    @Override
    public boolean isVisible() {
        return shouldApplyDropHack() ? false : super.isVisible();
    }


    /**
     * Returns a boolean indicating whether the drop hack should be applied.
     * 
     * @return a boolean indicating whether the drop hack should be applied.
     */
    protected boolean shouldApplyDropHack() {
        return !Boolean.FALSE.equals(treeTable.getClientProperty(DROP_HACK_FLAG_KEY));
    }