2013-01-02 56 views
2

我需要添加對從其他應用程序(文件管理器,Web瀏覽器,MS Word & OO編寫器)拖放圖像到我的應用程序中的JLabel的支持。
在JVM內部有很多關於DnD的例子,但是我找不到從本地應用程序或其他J2SE應用程序拖動的東西。將其他應用程序的支持從Java應用程序中刪除

我該如何添加拖放支持的圖像形式文件管理器,Web瀏覽器,MS Word & OO作家?

感謝

回答

4

類似的規定:

JComponent dropTargetComponent = ...; 
new DropTarget(dropTargetComponent , DnDConstants.ACTION_COPY, 
    new DropTargetListener() { 

     public void drop(DropTargetDropEvent dtde) { 
      Transferable tr = dtde.getTransferable(); 
      if(tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.imageFlavor)) { 
       Image image = (Image) tr.getTransferData(java.awt.datatransfer.DataFlavor.imageFlavor); 
       // Do something with image 
      } 
     } 

     ... 
    } 

您也可以嘗試針對java.awt.datatransfer.DataFlavor.javaFileListFlavor因爲來自文件管理器的東西通常是文件的列表返回一個List<File>

這裏是一個完全工作示例(從資源管理器的文件管理器,並從Firefox試圖DND):

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Image; 
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.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.Reader; 
import java.net.URI; 
import java.util.Iterator; 
import java.util.List; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class TestNativeDnD { 
    protected void initUI() { 
     final JFrame frame = new JFrame(TestNativeDnD.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JLabel dropTargetComponent = new JLabel("Drop something here") { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(600, 600); 
      } 
     }; 
     dropTargetComponent.setHorizontalAlignment(JLabel.CENTER); 
     final JLabel testLabel = new JLabel(); 
     new DropTarget(dropTargetComponent, DnDConstants.ACTION_COPY, new DropTargetListener() { 

      @Override 
      public void drop(DropTargetDropEvent dtde) { 
       try { 
        Transferable tr = dtde.getTransferable(); 
        dtde.acceptDrop(DnDConstants.ACTION_COPY); 
        if (tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.imageFlavor)) { 
         Image image = (Image) tr.getTransferData(java.awt.datatransfer.DataFlavor.imageFlavor); 
         showImageIcon(new ImageIcon(image)); 
        } else if (tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.javaFileListFlavor)) { 
         List<File> fileList = (List<File>) tr.getTransferData(java.awt.datatransfer.DataFlavor.javaFileListFlavor); 
         Iterator<File> iterator = fileList.iterator(); 
         if (iterator.hasNext()) { 
          File file = iterator.next(); 
          showImageIcon(new ImageIcon(file.getAbsolutePath())); 
         } 
        } else { 
         DataFlavor[] flavors = tr.getTransferDataFlavors(); 
         boolean handled = false; 
         for (int i = 0; i < flavors.length; i++) { 
          if (flavors[i].isRepresentationClassReader()) { 
           Reader reader = flavors[i].getReaderForText(tr); 
           BufferedReader br = new BufferedReader(reader); 
           java.lang.String line = null; 
           while ((line = br.readLine()) != null) { 
            try { 
             // kde seems to append a 0 char to the end of the reader 
             if ("0".equals(line)) { 
              continue; 
             } 
             File file = new File(new URI(line)); 
             showImageIcon(new ImageIcon(file.getAbsolutePath())); 
            } catch (Exception e) { 
             e.printStackTrace(); 
            } 
           } 
          } 
         } 
        } 
       } catch (UnsupportedFlavorException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

      public void showImageIcon(ImageIcon icon) { 
       testLabel.setIcon(icon); 
       frame.pack(); 
      } 

      @Override 
      public void dragEnter(DropTargetDragEvent dtde) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void dragOver(DropTargetDragEvent dtde) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void dropActionChanged(DropTargetDragEvent dtde) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void dragExit(DropTargetEvent dte) { 
       // TODO Auto-generated method stub 

      } 

     }); 
     frame.add(dropTargetComponent); 
     frame.add(testLabel, BorderLayout.EAST); 
     frame.setSize(600, 600); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestNativeDnD().initUI(); 
      } 
     }); 
    } 

} 
+0

+1簡單好用的 –

+0

遺憾的是沒有Firefox和OO作家不提供也不'DataFlavor.imageFlavor '或'DataFlavor.stringFlavor'或'DataFlavor.javaFileListFlavor'!也文件管理器只提供'DataFlavor.stringFlavor'!任何想法? – RYN

+1

@ 4r1y4n我剛剛在Win7 Java 6/7上使用FileManager(瀏覽器)和瀏覽器(Firefox)進行了嘗試,它的工作原理類似於魅力。請在我的答案結尾找到一個完整的工作示例 –

相關問題