如何在JavaSwing中使拖放从web浏览器接收图像?

如何在JavaSwing中使拖放从web浏览器接收图像?,java,image,swing,browser,drag-and-drop,Java,Image,Swing,Browser,Drag And Drop,我正在尝试通过拖放从web浏览器接收图像,但失败: package tests; import javax.swing.*; import java.awt.*; import java.awt.datatransfer.DataFlavor; public class JDragDropTest extends JFrame { public JDragDropTest() throws HeadlessException { super("DragDropTe

我正在尝试通过拖放从web浏览器接收图像,但失败:

package tests;

import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;

public class JDragDropTest extends JFrame {

    public JDragDropTest() throws HeadlessException {

        super("DragDropTest");

        setLayout(new BorderLayout());

        add(new JScrollPane(new JTextArea() {{
            setTransferHandler(new TransferHandler() {
                @Override
                public boolean canImport(TransferSupport support) {
                    return true;
                }

                @Override
                public boolean importData(TransferSupport support) {
                    int i=0;
                    append("flavors:\n");
                    for( DataFlavor flavor : support.getDataFlavors() ) {
                        append(String.valueOf(i+1) + "): " + flavor.toString() + "\n");
                        i++;
                    }
                    append("");

                    return true;
                }
            });
        }}), BorderLayout.CENTER);

    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {

                JFrame frame = new JDragDropTest();

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(800, 600);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });

    }
}
当从谷歌Chrome上拖动时,我得到的是131种颜色的字体,没有图像

其中一些有
InputStream
的表示类,我读了其中一些,得到了一些类似
imgsrc=
的文本

从Internet Explorer拖动时,我得到一个空列表

当尝试从Firefox中拖动时,我甚至无法开始拖动

操作系统是windows8.1prof

我想得到图像本身,不是它的URL,不是它的IMG标签。这可能吗?

以下是我的尝试(没有经过很好的测试):

  • 我只测试了
    Windows7
    JDK1.8.0_51
    Firefox39.0
    Chrome45.0
    stackoverflow配置文件图标


你用GC测试过吗?在这个例子中,我没有图像风格。我想知道在
URL
数据风格中中继是否比在文件列表中中继更安全。。。
import java.awt.*;
import java.awt.datatransfer.*;
import java.io.*;
import java.util.List;
import javax.swing.*;

public class JDragDropTest2 {
  public JComponent makeUI() {
    final JLabel label = new JLabel("Drop here image from a web browser");
    label.setTransferHandler(new TransferHandler() {
      @Override public boolean canImport(JComponent component, DataFlavor[] flavors) {
        return true;
      }
      @Override public boolean importData(JComponent component, Transferable transferable) {
        label.setText("");
        try {
          for (DataFlavor flavor : transferable.getTransferDataFlavors()) {
            System.out.println(flavor);
            if (DataFlavor.imageFlavor.equals(flavor)) {
              Object o = transferable.getTransferData(DataFlavor.imageFlavor);
              if (o instanceof Image) {
                label.setIcon(new ImageIcon((Image) o));
                return true;
              }
            }
            if (DataFlavor.javaFileListFlavor.equals(flavor)) {
              Object o = transferable.getTransferData(DataFlavor.javaFileListFlavor);
              if (o instanceof List) {
                List list = (List) o;
                for (Object f : list) {
                  if (f instanceof File) {
                    File file = (File) f;
                    System.out.println(file);
                    if (!file.getName().endsWith(".bmp")) {
                      label.setIcon(new ImageIcon(file.getAbsolutePath()));
                      return true;
                    }
                  }
                }
              }
            }
          }
        } catch (Exception ex) {
          ex.printStackTrace();
        }
        return false;
      }
      @Override public int getSourceActions(JComponent component) {
        return COPY;
      }
    });
    return new JScrollPane(label);
  }
  public static void main(String... args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.getContentPane().add(new JDragDropTest2().makeUI());
    frame.setSize(320, 240);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}