java - JTreeTable DnD 疯狂闪烁的下降光标

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

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

除拖放支持外,一切都按预期工作。我想要 DnD,它更像是 JTree 提供的。由于 JTreeTable 是一个扩展的 JTable,它提供了 JTable.DropLocation 类来确定放置位置,当将东西放入树中时,它没有提供足够的信息JTreeTable 的渲染列(没有路径也没有子索引)。我已经通过创建自定义 DropLocation 类解决了这个问题,该类基于 JTableJTree 版本的组合。我还修改了由上述 JTreeTable 实现提供的 TreeTableCellRenderer 类的绘制方法,以向用户显示此新信息(她现在能够查看是否如果在树列内,新节点将放置在选定节点的内部、之前或之后,正如您对 JTree 的期望一样。

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

使用 Java 1.6。

P.S.:我决定使用自定义 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));
    }

关于java - JTreeTable DnD 疯狂闪烁的下降光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8240721/

相关文章:

java - 如何找到按钮组中的该项被选中?

android - 如何在android中的两个列表之间实现拖放项目?

java - 生成TransactionBuilder时出错: Parameter specified as non-null is null

java - JFrame#setLayout(LayoutManager) 不起作用。强制执行 getContentPane().setLayout(LayoutManager)

java - 关于数字重复多少次的程序

java - 如何忽略Swing中的按键事件?

javascript - 拖放图片上传并删除 URL(不是文件)

angular - fullcalendar v4 外部放置事件

java - 谁创建事件对象以及它们在哪里创建?

java - 自动生成表格、工作流程