【问题标题】:How to make drag drop receiving images from web browser in Java Swing?java - 如何在Java Swing中使拖放从Web浏览器接收图像?
【发布时间】:2015-10-17 15:41:48
【问题描述】:

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

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

    }
}

当从谷歌浏览器中拖动时,我输入了 131 种风格,没有图像。

其中一些具有InputStream 的表示类,我正在阅读其中一些并得到一些像IMG SRC= 这样的文本。

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

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

操作系统是 Window 8.1 prof.

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

【问题讨论】:

    标签: java image swing browser drag-and-drop


    【解决方案1】:

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

    • 我只测试Windows 7JDK 1.8.0_51FireFox 39.0Chrome 45.0stackoverflow profile Icon

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

    【讨论】:

    • 你用 GC 测试过吗?我在这个案子中没有形象的味道。
    • 我想知道在URL 数据风格而不是文件列表中中继是否更安全...
    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2023-03-17
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2013-07-19
    相关资源
    最近更新 更多