Java JTreeTable DnD疯狂闪烁下拉光标

Java JTreeTable DnD疯狂闪烁下拉光标,java,swing,cursor,drag-and-drop,jtreetable,Java,Swing,Cursor,Drag And Drop,Jtreetable,我使用的是Sun示例JTreeTable的一个稍加修改的版本,由我自己的模型支持。这将是第三个例子(一个书签) 除拖放支持外,所有功能均按预期工作。我想要更像JTree提供的DnD。由于JTreeTable是一个扩展的JTable,因此它提供了JTable.DropLocation类,用于确定在将内容放入JTreeTable的树渲染列时没有提供足够信息的放置位置(没有路径和子索引)。我已经通过创建一个定制的DropLocation类解决了这个问题,该类基于JTable和JTree版本。我还修改了

我使用的是Sun示例
JTreeTable
的一个稍加修改的版本,由我自己的模型支持。这将是第三个例子(一个书签)

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

但有一个问题。当放置位置在树列中渲染时,鼠标光标会发疯。它会在几毫秒后出现然后消失,或者发生得太快,以至于拖动光标甚至没有显示出来。这也发生在未修改的Sun的示例中。我完全不知道这是为什么正在出现。确实在上找到了另一个具有相同问题的人,但提供的解决方案似乎将组件的放置位置设置为null,并且无法再使用
JTreeTable.getDropLocation()
方法检索。我需要将其转换为修改后的
DropLocation
,然后根据它绘制内容。 我离为我的用例找到一个合适的解决方案已经很近了,所以我可以尝试一下。这个光标闪烁的东西是我唯一的障碍。有什么想法吗

使用Java1.6


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

这听起来像是核心错误的表现(无法验证,该死的错误游行需要很长时间才能连接到…)。因此引用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));
    }
/**
*{@inheritDoc}
* 
*重写以绕过#766 swingx:光标在DnD中闪烁
*在树列上拖动时。这是一个与核心错误(#6700748)相关的错误
*在CellRenderPane上绘制渲染组件。一个技巧
*大概是让这个返回为false。
* 
*这个实现应用了一个技巧,即始终返回false。
*可以通过设置树表的客户机属性来禁用hack
*将\u HACK\u FLAG\u键放到Boolean.FALSE。
* 
*/
@凌驾
公共布尔值可见(){
返回shouldApplyDropHack()?false:super.isVisible();
}
/**
*返回一个布尔值,指示是否应应用drop hack。
* 
*@返回一个布尔值,指示是否应应用drop hack。
*/
受保护的布尔值shouldApplyDropHack(){
return!Boolean.FALSE.equals(treeTable.getClientProperty(DROP_HACK_FLAG_KEY));
}

的确如此。这是正确答案。覆盖TreeTableCellRenderer.isVisible()总是返回false就可以了。在这个问题的post scriptum中,我错误地指责
org.netbeans.swing.Outline
JXTreeTable
不能支持在所选树节点之前或之后删除。这不是真的,因为这些组件实际上支持它。它们都间接地将JTable子类化。而的确
JTable.DropLocation
不提供路径信息,您可以通过它提供的表行和表列获取路径信息。如果我知道这一点,我就不会费心滚动自己的组件了。我建议不要这样做。