Java TransferHandler.canImport(TransferSupport)在windows上被反复调用,但在Linux/Mac上却没有?

Java TransferHandler.canImport(TransferSupport)在windows上被反复调用,但在Linux/Mac上却没有?,java,swing,drag-and-drop,jtree,Java,Swing,Drag And Drop,Jtree,我在JTrees之间遇到一些DnD问题/混乱。在阅读了的文档并发现以下内容后 canImport(TransferHandler.TransferSupport) 在拖放操作期间重复调用此方法,以允许开发人员配置传输的属性,并返回传输的可接受性;返回值为true表示给定的TransferSupport(包含传输的所有详细信息)表示的传输在当前是可接受的,返回值为false表示拒绝传输 我实现了下面的类(长代码,抱歉)。这样做的目的是在树旁边显示一个信息工具提示,解释为什么可以或不可以拖放。该实现

我在JTrees之间遇到一些DnD问题/混乱。在阅读了的文档并发现以下内容后

canImport(TransferHandler.TransferSupport

在拖放操作期间重复调用此方法,以允许开发人员配置传输的属性,并返回传输的可接受性;返回值为true表示给定的TransferSupport(包含传输的所有详细信息)表示的传输在当前是可接受的,返回值为false表示拒绝传输

我实现了下面的类(长代码,抱歉)。这样做的目的是在树旁边显示一个信息工具提示,解释为什么可以或不可以拖放。该实现依赖于反复调用
canImport
,并且在我的开发平台(windows)上运行良好。然而,当在Linux/Mac上进行测试时,它不起作用,因为我使用的计时器没有重置(
canImport
仅在mouseMoved事件上调用,我承认,这听起来是合乎逻辑的)

这是正常行为还是java实现(或我的)中的一个bug?关于如何更改我的代码以使其在windows上像现在一样工作(我正在考虑在树组件中临时添加一个鼠标侦听器,并隐藏
mouseExited
)上的工具提示,有什么建议吗

import java.awt.*;
导入java.awt.datatransfer.*;
导入java.awt.event.*;
导入java.io.IOException;
导入javax.swing.*;
导入javax.swing.tree.*;
公共类DndDemo扩展JFrame{
私人JSplitPane jsppMain;
私有JScrollPane jscpTarget;
私有JTree jtTarget;
私有JScrollPane jscpSource;
私有JTree jtSource;
公共DndDemo(){
初始化组件();
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
DndDemo demo=新的DndDemo();
demo.setVisible(true);
}
});
}
私有组件(){
setLayout(新的BorderLayout());
DefaultMutableTreeNode根=新的DefaultMutableTreeNode(“拖动到此处”);
DefaultTreeModel模型=新的DefaultTreeModel(根);
对于(int i=0;i<10;i++){
DefaultMutableTreeNode子节点=新的DefaultMutableTreeNode(“成员”+i);
insertNodeInto(子对象,根对象,i);
}        
jtTarget=新的JTree(模型);
jscpTarget=新的JScrollPane(jtTarget);
root=新的DefaultMutableTreeNode(“从此处拖动”);
模型=新的DefaultTreeModel(根);
对于(int i=0;i<10;i++){
DefaultMutableTreeNode子节点=新的DefaultMutableTreeNode(“选项”+i);
insertNodeInto(子对象,根对象,i);
}        
jtSource=新的JTree(模型);
jscpSource=新的JScrollPane(jtSource);
jsppMain=新的JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jscpTarget,jscpSource);
jsppMain.setdividerllocation(150);
添加(jsppMain);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jtTarget.setDragEnabled(true);
setTransferHandler(新的TreeTransferHandler());
jtTarget.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
jtSource.setDragEnabled(真);
setTransferHandler(新的TreeTransferHandler());
jtSource.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
立根(0,0,300,300);
setLocationRelativeTo(空);
}
/**
*这是我的代码的主要部分,其他的都是支持代码。
*/
私有类TreeTransferHandler扩展了TransferHandler{
私人弹出提示窗口;
私人树路提帕;
专用定时器;
公共TreeTransferHandler(){
//显示提示后,在计时器结束时将其关闭
ToolTimmer=新计时器(100,新ActionListener(){
已执行的公共无效操作(操作事件e){
hidedroptoltip();
}
});
tooltipTimer.setRepeats(false);
}
@凌驾
public int getSourceActions(JComponent c){
返回TransferHandler.MOVE;
}
@凌驾
受保护的可转让组件(JComponent c){
JTree树=(JTree)c;
if(tree==jtTarget){
返回null;
}
TreePath selectionPath=tree.getSelectionPath();
如果(selectionPath==null){
返回null;
}
DefaultMutableTreeNode=(DefaultMutableTreeNode)selectionPath.getLastPathComponent();
返回新的TreeTransferable(节点,TreeTransferable.SOURCE);
}
@凌驾
公共布尔值canImport(TransferHandler.TransferSupport){
//这个方法应该在DnD期间被重复调用
//根据它的文档,在windows上是这样,但仅限于linux/mac
//在鼠标移动时调用它(大概)。
DefaultMutableTreeNode节点;
int-src;
试一试{
node=(DefaultMutableTreeNode)support.getTransferable().getTransferData(treetTransferable.node_);
src=(整数)support.getTransferable().getTransferData(treetTransferable.src_);
}捕获(无支持的LavorEx异常){
UpdateDroptoltip(支持,“不支持的DnD对象”,false);
返回false;
}捕获(IOEX异常){
UpdateDroptoltip(支持,“不支持的DnD对象”,false);