2012-01-07 64 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