我想从其他应用程序处理File Drops
现在,我可以区分不同的DataFlavors并接受正确的类型。

这是我正在使用的源代码:

private TransferHandler transferehandler = new TransferHandler(){
        @Override
        public boolean canImport(TransferHandler.TransferSupport support) {
        if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
            return false;
        }

            boolean copySupported = (MOVE & support.getSourceDropActions()) == MOVE;

            if (!copySupported) {
                return false;
            }

            support.setDropAction(MOVE);


        return true;
        }


第一部分是设置我的canImport,以检查File是否支持MOVE选项,并检查其是否为文件。

@Override
        public boolean importData(TransferHandler.TransferSupport support){
            if(!canImport(support))
                return false;
             Transferable t = support.getTransferable();
             try {
                List<File> l = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
                System.out.println(l);
            } catch (UnsupportedFlavorException | IOException e) {
                e.printStackTrace();
                return false;
            }
             return true;
        }
    };


这是我importData方法的实现。为了进行测试,我正在打印每个拖到具有此ComponentTransferHandler上的文件。

通过阅读JavaDocs,我只能达到可以处理来自不同JPanels的墨滴的地步。
但是我实际上想创建这样的东西:

java - 整个JFrame上的TransferHandler-LMLPHP

我希望你明白我的意思。

最佳答案

在这里,您可以在任何子组件上进行DnD操作(就像我在评论中写道)。您可以同时在红色(父内容窗格)和蓝色(子级)组件上放置。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.TransferHandler;


public class TransferableJFrame {



    public static void main(String[] args) {
        JFrame f=new JFrame();

        f.setSize(1000, 1000);

        JPanel contentPane=new JPanel();
        contentPane.setOpaque(true);
        contentPane.setBackground(Color.red);
        contentPane.setLayout(new FlowLayout());

        contentPane.setTransferHandler(new MyTrasnferHandler());


        JPanel child=new JPanel();
        child.setOpaque(true);
        child.setBackground(Color.BLUE);
        child.setPreferredSize(new Dimension (600,600));
        contentPane.add(child);
        f.setContentPane(contentPane);

        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);


    }

    private static class MyTrasnferHandler extends TransferHandler{
        @Override
        public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
            System.out.println("we will drop here");
            return true;
        }
        @Override
        public boolean importData(JComponent comp, Transferable t) {
            System.out.println("Dropped");
            return super.importData(comp, t);
        }
    }


}

09-25 22:31
查看更多