2012-01-07 1 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 полученное изображение всегда нуль и NullPointerException выбрасывают, когда ImageIcon идет экземпляр.

Кто-то знает, почему это происходит?

ответ

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

Это было проверено на моем Mac с помощью 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

Спасибо, что нашли время для исследования т.е. Я не знаю, что происходит, но использую точно такую ​​же настройку, как вы (chrome, OSX 10.7.2, java 1.6.0_29). Я получаю нулевые данные передачи как с вашим, так и с моим кодом. – Philippe

+0

Он работает с Safari и почтой – Philippe

0

Использование Windows Seven, Java версии "1.6.0_29", и 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; presentationclass = java.awt.Image]

С Chrome Я не вижу эту строку: он не возвращает правильный MIME-тип в соответствии с DataFlavor. imageFlavor

+1

Не нашел решения для этого, я поддерживаю только файлы, чтобы избежать путаницы – Philippe

Смежные вопросы