2012-01-07 86 views
2

我希望能夠在JLabel從圖像中丟棄時設置圖像。一個網頁瀏覽器。我基於Drag-and-Drop Support for Images的實現。將圖像從瀏覽器拖放到JLabel上

@Override 
public boolean importData(JComponent comp, Transferable t) { 
    if (comp instanceof JLabel) { 
     JLabel label = (JLabel) comp; 
     if (t.isDataFlavorSupported(DataFlavor.imageFlavor)) { 
      try { 
       image = (Image) t.getTransferData(DataFlavor.imageFlavor); 
       ImageIcon icon = new ImageIcon(image); 
       label.setIcon(icon); 
       return true; 
      } catch (Throwable th) { 
       log.error("Failed to accept dropped image", th); 
      } 
     } else if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      try { 
       @SuppressWarnings("unchecked") 
       List<File> files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor); 
       if (files.size() == 1) { 
         ImageIcon icon = new ImageIcon(files.get(0).getAbsolutePath()); 
         label.setIcon(icon); 
       } 
       return true; 
      } catch (Throwable th) { 
       log.error("Failed to accept dropped image", th); 
      } 
     } 
    } 
    return false; 
} 

對於DataFlavor.javaFileListFlavor部分一切工作正常,但與DataFlavor.imageFlavour產生的圖像總是空和ImageIcon的被實例化時,一個NullPointerException異常被拋出。

有人知道爲什麼會發生這種情況?

回答

4

你的代碼似乎很好。我使用以下代碼對其進行了測試,然後將我網絡瀏覽器(Google Chrome)中的圖像拖放到JPanel上,將圖像設置爲JLabel

import javax.swing.ImageIcon; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.TransferHandler; 
import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Image; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.io.IOException; 
import java.lang.reflect.InvocationTargetException; 

public class DragAndDropTester { 
    private static final JLabel TEST_LABEL = new JLabel("TestLabel"); 

    public static void main(String[] args) { 
    try { 
     EventQueue.invokeAndWait(new Runnable() { 
     public void run() { 

      JFrame testFrame = new JFrame("Test"); 

      JPanel contents = new JPanel(new BorderLayout()); 
      contents.add(TEST_LABEL, BorderLayout.CENTER); 

      contents.setTransferHandler(createTransferHandler()); 

      testFrame.getContentPane().add(contents); 
      testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      testFrame.setSize(200, 200); 
      testFrame.setVisible(true); 
     } 
     }); 
    } catch (InterruptedException e) { 
    } catch (InvocationTargetException e) { 
    } 
    } 

    private static TransferHandler createTransferHandler(){ 
    return new TransferHandler(){ 
     @Override 
     public boolean importData(JComponent comp, Transferable aTransferable) { 
     try { 
      Object transferData = aTransferable.getTransferData(DataFlavor.imageFlavor); 
      TEST_LABEL.setIcon(new ImageIcon((Image) transferData)); 
     } catch (UnsupportedFlavorException e) { 
     } catch (IOException e) { 
     } 
     return true; 
     } 

     @Override 
     public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { 
     return true; 
     } 
    }; 
    } 
} 

這是使用JDK1.6

java version "1.6.0_29" 
Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-10M3527) 
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode) 
+0

感謝您花時間調查TE。我不知道發生了什麼,但使用與您完全相同的設置(chrome,OSX 10.7.2,java 1.6.0_29)我的代碼和我的代碼都獲得了空傳輸數據。 – Philippe 2012-01-08 21:07:22

+0

它從Safari和郵件工作 – Philippe 2012-01-08 21:14:37

0

使用Windows 7中,Java版本 「1.6.0_29」 在我的Mac測試,和Firefox 8.0.1,做工精細。 但與其他瀏覽器不工作?

對於小的修改:

private static TransferHandler createTransferHandler() { 
    return new TransferHandler() { 
     @Override 
     public boolean importData(JComponent comp, 
       Transferable aTransferable) { 
      DataFlavor[] transferData = aTransferable.getTransferDataFlavors(); 
      for(DataFlavor df:transferData){ 
       System.out.println(df.toString()); 
      } 

      System.out.println("-----------------------------------"); 
      return true; 
     } 

     @Override 
     public boolean canImport(JComponent comp, 
       DataFlavor[] transferFlavors) { 
      return true; 
     } 
    }; 
} 

我從Firefox中的DataFlavor []下拉菜單的圖像,可以看到這一行: java.awt中。 datatransfer.DataFlavor [mimetype = image/x-java-image; representationclass = java.awt.Image]

使用Chrome我看不到這一行:它不返回正確的MIME類型以與DataFlavor匹配。 imageFlavor

+1

還沒有找到一個解決方案,我只支持文件滴,以避免混淆 – Philippe 2012-03-24 09:21:23