有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何将数据从浏览器拖放到具有自定义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) 个答案