6

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

除了拖放支持外,一切都按预期工作。我想要 DnD,它更像是 aJTree提供的。由于JTreeTable是一个扩展JTable,它提供了用于确定放置位置的类,当将内容放置到树渲染的列(无路径和无子索引)JTable.DropLocation时,该类没有提供足够的信息。JTreeTable我已经通过创建一个DropLocation基于它的组合JTableJTree版本的自定义类来解决这个问题。我还修改了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问题,并且不支持在所选树节点之前或之后删除(仅在内部)。如果您知道确实提供此类功能的组件,我会很高兴听到它。

4

1 回答 1

10

这听起来像是核心错误#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));
    }
于 2011-11-23T11:40:08.563 回答