我正在使用由我自己的模型支持的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问题的困扰,并且不支持在选定树节点之前或之后删除(仅限内部)。如果您知道确实提供这种功能的组件,那么我将很高兴听到它。

最佳答案

这听起来像是核心错误#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));
    }

10-01 18:07