我想从其他应用程序处理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
方法的实现。为了进行测试,我正在打印每个拖到具有此Component
的TransferHandler
上的文件。通过阅读JavaDocs,我只能达到可以处理来自不同
JPanels
的墨滴的地步。但是我实际上想创建这样的东西:
我希望你明白我的意思。
最佳答案
在这里,您可以在任何子组件上进行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);
}
}
}