2013-02-26 114 views
4

特定擴展名的拖N - 下降文件,我想實現免打擾我的應用程序接受某些擴展(如WRL)的唯一文件。我想光標更改爲拖動光標,如果該文件將被接受,並恢復到正常光標時擴展名錯誤的文件拖動和刪除。對Java的JFrame

我已經從http://docs.oracle.com/javase/tutorial/uiswing/dnd/toplevel.html

,我提出的是在canImport功能

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; 
     } 
    } 

,當我在不同的文件中拖過這個正確的行爲的變化遵循下面的教程/例子。然而,當我把文件,我得到以下異常

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) 

任何幫助,不勝感激

+1

歡迎來到我的世界。我認爲你可以做到這一點,直到實際發生下降。我相信會發生這種情況,因爲在下降發生之前,JVM不會創建實際可傳輸的數據對象。 – MadProgrammer 2013-02-26 02:24:36

+0

@MadProgrammer我同意,但我想提供更多的直接反饋給用戶 – Leon 2013-02-26 02:25:39

+0

所以我會,但沒有在轉讓對象實際檢查的數據的能力,沒有什麼更多可以做,直到它的下跌... – MadProgrammer 2013-02-26 02:26:35

回答

12

我最後一次檢查,這並沒有對Mac的工作,但有可能與Java 7的改變...

enter image description hereenter image description hereenter image description here

現在,請記住,當涉及到拖放,沒有簡單的答案,將盡一切。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.awt.dnd.DnDConstants; 
import java.awt.dnd.DropTarget; 
import java.awt.dnd.DropTargetDragEvent; 
import java.awt.dnd.DropTargetDropEvent; 
import java.awt.dnd.DropTargetEvent; 
import java.awt.dnd.DropTargetListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.List; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestDragNDrop { 

    public static void main(String[] args) { 
     new TestDragNDrop(); 
    } 

    public TestDragNDrop() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public static class TestPane extends JPanel implements DropTargetListener { 

     public enum DragState { 

      Waiting, 
      Accept, 
      Reject 
     } 
     private DragState state = DragState.Waiting; 
     private BufferedImage happy; 
     private BufferedImage wait; 
     private BufferedImage sad; 

     public TestPane() { 
      DropTarget dt = new DropTarget(
        this, 
        DnDConstants.ACTION_COPY_OR_MOVE, 
        this, 
        true); 

      setBackground(Color.BLACK); 
      try { 
       happy = ImageIO.read(getClass().getResource("/Happy.png")); 
       wait = ImageIO.read(getClass().getResource("/Wait.png")); 
       sad = ImageIO.read(getClass().getResource("/Sad.png")); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(300, 300); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      BufferedImage bg = null; 
      switch (state) { 
       case Waiting: 
        bg = wait; 
        break; 
       case Accept: 
        bg = happy; 
        break; 
       case Reject: 
        bg = sad; 
        break; 
      } 
      if (bg != null) { 
       int x = (getWidth() - bg.getWidth())/2; 
       int y = (getHeight() - bg.getHeight())/2; 
       g.drawImage(bg, x, y, this); 
      } 
     } 

     @Override 
     public void dragEnter(DropTargetDragEvent dtde) { 
      state = DragState.Reject; 
      Transferable t = dtde.getTransferable(); 
      if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
       try { 
        Object td = t.getTransferData(DataFlavor.javaFileListFlavor); 
        if (td instanceof List) { 
         state = DragState.Accept; 
         for (Object value : ((List) td)) { 
          if (value instanceof File) { 
           File file = (File) value; 
           String name = file.getName().toLowerCase(); 
           if (!name.endsWith(".png")) { 
            state = DragState.Reject; 
            break; 
           } 
          } 
         } 
        } 
       } catch (UnsupportedFlavorException | IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 
      if (state == DragState.Accept) { 
       dtde.acceptDrag(DnDConstants.ACTION_COPY); 
      } else { 
       dtde.rejectDrag(); 
      } 
      repaint(); 
     } 

     @Override 
     public void dragOver(DropTargetDragEvent dtde) { 
     } 

     @Override 
     public void dropActionChanged(DropTargetDragEvent dtde) { 
     } 

     @Override 
     public void dragExit(DropTargetEvent dte) { 
      state = DragState.Waiting; 
      repaint(); 
     } 

     @Override 
     public void drop(DropTargetDropEvent dtde) { 
      state = DragState.Waiting; 
      repaint(); 
     } 
    } 
} 
+0

看起來像我需要什麼。只要檢查,如果工作,我會upvote和接受 – Leon 2013-02-26 04:49:14