Java JTreeTable DnD疯狂闪烁下拉光标
我使用的是Sun示例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版本。我还修改了
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
不提供路径信息,您可以通过它提供的表行和表列获取路径信息。如果我知道这一点,我就不会费心滚动自己的组件了。我建议不要这样做。