如何将数据从浏览器拖放到具有自定义MIME类型的java swing应用程序中?
我目前正在编写一个程序,使用户能够将一些数据从浏览器拖放到java swing应用程序中。这与mime类型“text/plain”的工作原理相同,但当在javascript中使用自定义mime类型时,java应用程序不再接收数据
javascript端按照this答案中的描述完成:
for (const el of document.querySelectorAll('[draggable="true"]')) {
el.addEventListener('dragstart', (e) => {
e.dataTransfer.setData('text/plain', e.currentTarget.dataset.content);
});
}
java应用程序看起来像这个MRE。MRE只是打印出所有接收到的液滴
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDropEvent;
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
JTextArea area = new JTextArea();
area.setDropTarget(new DropTarget() {
@Override
public synchronized void drop(DropTargetDropEvent dtde) {
dtde.acceptDrop(TransferHandler.COPY_OR_MOVE);
try {
// For testing
System.out.println(Arrays.toString(dtde.getTransferable().getTransferDataFlavors()));
// Business logic, e.g.
System.out.println(dtde.getTransferable().getTransferData(DataFlavor.stringFlavor));
} catch (UnsupportedFlavorException | IOException e) {
e.printStackTrace();
}
}
});
frame.add(area);
// Only for MRE, never set size like this for actual programs
area.setPreferredSize(new Dimension(200, 100));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
这与链接答案中的JSFIDLE一样有效。然而,应该传输的数据不仅仅是纯文本,实际上是json字符串。此外,字符串应该只在我自己的应用程序中删除,而不应该放到任何文本编辑器中。因此,我将javascript中的mime类型更改为'text/json'
。在java方面,我替换了
System.out.println(dtde.getTransferable().getTransferData(DataFlavor.stringFlavor));
与
System.out.println(dtde.getTransferable().getTransferData(new DataFlavor("text/json;class=java.lang.String")));
这导致了这一行中的UnsupportedFlavorException
:
java.awt.datatransfer.UnsupportedFlavorException: text/json
at java.desktop/sun.awt.dnd.SunDropTargetContextPeer.getTransferData(SunDropTargetContextPeer.java:256)
at java.desktop/sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:73)
at java.desktop/java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:386)
at Main$1.drop(Main.java:23)
此外,TransferDataFlavors
数组为空,表明没有DataFlavor
可用。我考虑过覆盖FlavorMap
以确保本地mime类型映射到正确的风格,但调试DataTransferer
中的getFlavorsForFormats
方法发现只请求以下本地人(使用chrome):
“DragContext”、“chromium/x-renderer-taint”、“chromium Web自定义MIME数据格式”和“DragImageBits”,因此我的自定义MIME类型甚至不能作为本机类型使用
如何将数据从浏览器正确传输到java应用程序?我需要在什么地方注册我的口味吗?或者这是不可能的,我需要坚持^{
共 (0) 个答案