Java 整个JFrame上的TransferHandler

Java 整个JFrame上的TransferHandler,java,swing,Java,Swing,我想处理从其他应用程序中删除的文件。 现在我可以区分不同的DataFlavors并接受正确的类型 以下是我正在使用的源代码: private TransferHandler transferehandler = new TransferHandler(){ @Override public boolean canImport(TransferHandler.TransferSupport support) { if (!support.isData

我想处理从其他应用程序中删除的
文件。
现在我可以区分不同的
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;
        }
第一部分是设置my canImport,以检查文件是否支持
移动
选项,并检查其是否为文件

@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;
        }
    };
@覆盖
公共布尔输入数据(TransferHandler.TransferSupport){
如果(!canImport(支持))
返回false;
可转移t=support.getTransferable();
试一试{
List l=(List)t.getTransferData(DataFlavor.javaFileListFlavor);
系统输出打印LN(l);
}捕获(无支持的LavorException | IOE异常){
e、 printStackTrace();
返回false;
}
返回true;
}
};
下面是我对
importData
方法的实现。出于测试目的,我正在打印每个拖到
组件上的文件,该组件具有此
TransferHandler

通过阅读本文,我只能处理来自不同
jpanel
的数据。 但我实际上想创造这样的东西:


我希望您理解我的意思。

这里您可以对任何子组件进行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);
        }
    }


}

将您的DnD处理程序直接设置为主顶级容器(内容窗格)怎么样
JFramage.getContentPane()
您不能直接将其设置到
内容窗格
,但是如果您将其添加到JFrame中,则只有上方的
可拖放,事实上我可以将TransferHandler设置为每个组件,但这太可笑了,因为我刚刚错过了WCS Elazer(countrymate)VS Hydra为您编写了该示例;)哦,老兄,听到这个消息我很难过^^^但听起来很简单,它确实起作用了!也许他们应该把这些小信息添加到他们的教程中。类似这样的一句话:“如果将处理程序添加到父组件,它也会影响所有子组件”。附言:《星际争霸》是一款非常好的游戏,但对我来说有点太快了:老实说,他们玩过了。很高兴我能帮上忙是的,我误读了
,但您也可以直接在顶级容器上设置TransferHandler,如JFrame和JDialog。
,并认为这只会影响应用程序的“外部”部分,如标题栏。