为什么我会收到 InvalidDnDOperationException?

2024-03-30

I'm sorry; I don't like asking "why am I getting exception?" questions on StackOverflow (bit ironic now that I think of it...), but I can't figure out the cause of this exception! I've searched for a solution, but those that popped up were either for a subtly different exception https://stackoverflow.com/questions/14754728/dragsource-invaliddndoperationexception-on-starting-dragaction, when people were trying to access a Transferrable outside of an event handler https://stackoverflow.com/questions/15080244/java-drag-n-drop-files-of-specific-extension-on-jframe, or not ever answered at all https://stackoverflow.com/questions/17608576/suggestions-on-handling-the-invaliddndoperationexception-exception.

我正在尝试在内部执行此操作DropTargetListener#drop(DropTargetListener)方法。我通过从程序运行所在的同一驱动器中拖动 PNG 来测试这一点,这让我认为数据是随时可用的。我的相关代码和产生的异常如下:

Code

(为简洁起见,注释中的行号,后跟=>如果是错误行)

        // package declaration
        // imports

/*45 */ public class BHFileChooser extends JComponent implements DropTargetListener
/*46 */ {
            // object declaration 

            ...

            // initialization methods

            ...

/*186*/     @Override
/*187*/     public void dragEnter(DropTargetDragEvent dtde)
/*188*/     {
/*189*/         setState(State.EVALUATING);
/*190*/         setState(canAccept(dtde.getTransferable()) ? State.EVALUATED_ACCEPTABLE : State.EVALUATED_UNACCEPTABLE);
/*191*/         validate();
/*192*/     }
/*193*/ 
/*194*/     @Override
/*195*/     public void dragExit(DropTargetEvent dte)
/*196*/     {
/*197*/         setState(State.WAITING);
/*198*/         validate();
/*199*/     }
/*200*/ 
/*201*/     @Override public void dragOver(DropTargetDragEvent dtde){} // unused for now
/*202*/ 
/*203*/     @Override
/*204*/     public void dropActionChanged(DropTargetDragEvent dtde)
/*205*/     {
/*206*/         userAction = dtde.getDropAction();
/*207*/         validate();
/*208*/     }
/*209*/ 
/*210*/     @Override
/*211*/     public void drop(DropTargetDropEvent dtde)
/*212*/     {
/*213*/         setState(State.WAITING); // I use a finite-state machine to keep track of what's happening
/*214*/         setState(State.EVALUATING);
/*215*/         Transferable t = dtde.getTransferable();
/*216*/         try
/*217*/         {
/*218 =>*/          if (canAccept(t))
/*219*/                 try
/*220*/                 {
/*221*/                     setState(State.EVALUATED_ACCEPTABLE);
/*222*/                     File f = (File)t.getTransferData(DataFlavor.javaFileListFlavor);
/*223*/                     acceptFile(f);
/*224*/                 }
/*225*/                 catch (UnsupportedFlavorException ex)
/*226*/                 {
/*227*/                     setState(State.EVALUATED_UNACCEPTABLE);
/*228*/                 }
/*229*/                 catch (IOException ex)
/*230*/                 {
/*231*/                     Logger.getGlobal().log(Level.SEVERE, MESSAGE_IO_EXCEPTION, ex);
/*232*/                 }
/*233*/             else
/*234*/                 setState(State.EVALUATED_UNACCEPTABLE);
/*235*/         }
/*236*/         catch (Throwable th)
/*237*/         {
/*238*/             th.printStackTrace();
/*239*/             setState(State.EVALUATED_UNACCEPTABLE); // evaluation could not be completed, so we can't accept it
/*240*/             setState(State.WAITING);                // go back to waiting for another file
/*241*/         }
/*242*/         
/*243*/         validate();
/*244*/     }

            // more methods

            ...

/*267*/     public void acceptFile(File f)
/*268*/     {
/*269*/         if (fileFilter == null || fileFilter.accept(f))
/*270*/         {
/*271*/             setState(State.EVALUATED_ACCEPTABLE);
/*272*/             setState(State.LOADING);
/*273*/             file = f;
/*274*/             setState(State.LOADED);
/*275*/         }
/*276*/         else
/*277*/             setState(State.EVALUATED_UNACCEPTABLE);
/*278*/     }

            // more methods

            ...

/*311*/     private boolean canAccept(Transferable t)
/*312*/     {
/*313*/         try
/*314*/         {
/*315*/             System.out.println(Arrays.deepToString(t.getTransferDataFlavors()));
/*316*/             
/*317*/             if (!t.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
/*318*/                 return false;
/*319*/             
/*320 =>*/          List<File> data = (List)t.getTransferData(DataFlavor.javaFileListFlavor); // the error occurs in here
/*321*/             if (fileFilter == null)
/*322*/                 return true;
/*323*/             return
/*324*/                 data.stream() // treat the list as a stream
/*325*/                 .noneMatch(   // return true if none match the following rule:
/*326*/                     (f) -> (                  // for each file
/*327*/                         !fileFilter.accept(f) // if the filter doesn't accept it
/*328*/                     )
/*329*/                 )
/*330*/             ;
/*331*/         }
/*332*/         catch (UnsupportedFlavorException ex){}
/*333*/         catch (IOException ex)
/*334*/         {
/*335*/             Logger.getLogger(BHFileChooser.class.getName()).log(Level.SEVERE, MESSAGE_IO_EXCEPTION, ex);
/*336*/         }
/*337*/         return false;
/*338*/     }

            ...

            // more methods

            ...

            // internal classes & enums like State
/*468*/ }

例外

java.awt.dnd.InvalidDnDOperationException: No drop current
    at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(SunDropTargetContextPeer.java:245)
    at sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:73)
    at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:376)
    at org.bh.tools.comps.BHFileChooser.canAccept(BHFileChooser.java:320)
    at org.bh.tools.comps.BHFileChooser.drop(BHFileChooser.java:218)
    at java.awt.dnd.DropTarget.drop(DropTarget.java:455)
    at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(SunDropTargetContextPeer.java:538)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(SunDropTargetContextPeer.java:852)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(SunDropTargetContextPeer.java:776)
    at sun.awt.dnd.SunDropTargetEvent.dispatch(SunDropTargetEvent.java:48)
    at java.awt.Component.dispatchEventImpl(Component.java:4738)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4705)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    at java.awt.LightweightDispatcher.processDropTargetEvent(Container.java:4611)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4457)
    at java.awt.Container.dispatchEventImpl(Container.java:2278)
    at java.awt.Window.dispatchEventImpl(Window.java:2739)
    at java.awt.Component.dispatchEvent(Component.java:4705)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
    at java.awt.EventQueue.access$400(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:697)
    at java.awt.EventQueue$3.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:719)
    at java.awt.EventQueue$4.run(EventQueue.java:717)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

另外,这是什么意思No drop current?我没有在任何地方看到这个记录。


我认为你应该打电话:

dtde.acceptDrop(DragNDropConstants.ACTION_COPY_OR_MOVE);

Java 7 及更高版本:

dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);

before

dtde.getTransferable();

'如果不这样做的话,自定义的 getTransferable 没有问题,Java 的 Transferable 进行本机拖放操作需要这个调用。'

ref 1 http://forums.codeguru.com/showthread.php?204753-DragNDrop-Exception-No-drop-current,

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我会收到 InvalidDnDOperationException? 的相关文章

  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp

随机推荐