如何在JavaSwing中使拖放从web浏览器接收图像?
我正在尝试通过拖放从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
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);
}
}