I would like to implement DnD for my application to accept only files of a certain extension (e.g. wrl). I would like to move the cursor to the drag cursor if the file is accepted and returns to the normal cursor when the file with the wrong extension is dragged.
I ran the following tutorial / example from http://docs.oracle.com/javase/tutorial/uiswing/dnd/toplevel.html
The change I'm doing is in the canImport function
public boolean canImport(TransferHandler.TransferSupport support) { if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { return false; } Transferable t = support.getTransferable(); try { java.util.List<File> l = (java.util.List<File>)t.getTransferData(DataFlavor.javaFileListFlavor); if (l.size() != 1) { return false; } File f = l.get(0); String extension = f.getName().substring(f.getName().lastIndexOf(".")); return extension.equalsIgnoreCase(".wrl"); } catch (UnsupportedFlavorException e) { return false; } catch (IOException e) { return false; } }
This behaves correctly when I drag and drop files in different files. However, when I drop the file, I get the following exception
Exception in thread "AWT-EventQueue-0" java.awt.dnd.InvalidDnDOperationException: No drop current at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(SunDropTargetContextPeer.java:227) at sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:56) at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:359) at appl.TopLevelTransferHandlerDemo$1.canImport(TopLevelTransferHandlerDemo.java:207) at javax.swing.TransferHandler$DropHandler.drop(TransferHandler.java:1454) at java.awt.dnd.DropTarget.drop(DropTarget.java:434) at javax.swing.TransferHandler$SwingDropTarget.drop(TransferHandler.java:1193) at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(SunDropTargetContextPeer.java:519) at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(SunDropTargetContextPeer.java:832) at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(SunDropTargetContextPeer.java:756) at sun.awt.dnd.SunDropTargetEvent.dispatch(SunDropTargetEvent.java:30) at java.awt.Component.dispatchEventImpl(Component.java:4487) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processDropTargetEvent(Container.java:4312) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4163) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Any help is much appreciated
source share