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。
,并认为这只会影响应用程序的“外部”部分,如标题栏。