java - 如何在 Java Swing 中拖放从 Web 浏览器接收图像?

标签 java image swing browser drag-and-drop

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

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

    }
}

从 Google Chrome 拖动时,我得到 131 种风格的输出,没有图像。

其中一些具有 InputStream 的表示类,我正在阅读其中一些并获得一些文本,如 IMG SRC=

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

尝试从 Firefox 拖动时,我什至无法开始拖动。

操作系统是 Window 8.1 教授。

我想获取图片本身,而不是它的 URL,也不是它的 IMG 标签。这可能吗?

最佳答案

这是我的尝试(未经过充分测试):

  • 我只测试 Windows 7JDK 1.8.0_51FireFox 39.0Chrome 45.0stackoverflow 配置文件图标

enter image description here

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

关于java - 如何在 Java Swing 中拖放从 Web 浏览器接收图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31653353/

相关文章:

java - 如何在 java netbeans 中制作一个隐藏的 "Exit"按钮?

java - 将 URI 字符串解析为名称-值集合

java - 将文件设置为不可读

java - 检查 a,b,c 边的直角是否有效。但是您不能使用循环、条件、数组或更高级的功能

cocoa - 在 NSTableView 中使用带有模板图像的 NSButtonCell

java - 为什么上传照片时我的 GUI 布局会改变?

java - Android开发图片上传损坏

java - 文本超出 JTextArea

java - 我应该创建一个新窗口还是修改旧窗口?

javascript - Bat 代码 Spigot 服务器