如何复制文件并使用Java将其粘贴到剪贴板?
如何复制文件并将其粘贴到使用Java的剪贴板?我的程序可以复制但不能粘贴。它给如何复制文件并使用Java将其粘贴到剪贴板?
异常在线程 “主要” java.lang.ClassCastException:
java.util.Arrays中的$ ArrayList中不能转换成java.io.File
我的代码:
class FileTransferable implements Transferable {
private final File file;
public FileTransferable(File file) {
this.file = file;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { DataFlavor.javaFileListFlavor };
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return DataFlavor.javaFileListFlavor.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
final ArrayList<File> files = new ArrayList<File>();
files.add(file);
return files;
}
}
Java无法处理特定的操作系统相关操作,如干扰剪贴板等,因为它是独立于平台的语言。在JLS和Java API中,没有用于剪贴板干涉的方法,但是有一些方法可以处理在Java API中声明的文件系统操作,作为JLS(Java语言规范)的一部分,JLS实现在大多数JVM实现中。为了做到这一点,您应该使用JNI(Java本地接口)本地开发C/C++(使用Win32 API等)或使用现成的二进制文件并在您的Java应用程序中调用它们。
啊,来吧。剪贴板操作对Java来说不成问题。 (-1表明它在... C/C++ *不寒而栗*) – 2011-05-23 19:10:23
Java可以处理剪贴板吗? – 2011-05-23 19:35:39
是的。 http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Toolkit.html#getSystemClipboard%28%29 – Jberg 2011-05-23 19:39:24
我无法在实际代码中检测到任何问题。我想,这个投射错误发生在你实际上收到的内容从复制/粘贴操作中,你收到一个文件,包裹在一个列表中,并且可能会将列表投到File
。
下面是从DGuitar源代码采取一个完整的示例根据您的评论
/*
* ADropTargetListener
* Created on 20/04/2005
*
*
*/
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* The Drop action happens in this order: 1. dragEnter =
when the mouse enters
* the component 2. dragOver = after the mouse has entered
but has not been
* released 3. drop = when the mouse is released
*
* @author Mauricio Gracia G
*/
public class ADropTargetListener implements DropTargetListener {
/**
* creates a DropTargetListener
*/
public ADropTargetListener() {
}
/**
* overrides the DROP method.
*
* @see java.awt.dnd.DropTargetListener#drop(java.awt.dnd.DropTargetDropEvent)
*/
public void drop(DropTargetDropEvent dtde) {
Transferable transfer;
transfer = dtde.getTransferable();
//we must accept the transfer to process it
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
importData(transfer);
}
/**
* Imports the data of the Drop action
* @param t the transferable object
*/
public void importData(Transferable t) {
if (canImport(t.getTransferDataFlavors())) {
try {
DataFlavor[] flavors = t.getTransferDataFlavors();
for (int i = 0; i < flavors.length; i++) {
// Drop from Windows
if (DataFlavor.javaFileListFlavor.equals(flavors[i])) {
Object gtd ;
gtd = t.getTransferData(DataFlavor.javaFileListFlavor) ;
if (gtd instanceof List) {
@SuppressWarnings("unchecked")
List<File> fileList = (List<File>) gtd;
//YOUR CODE here to process the list of Files
}
}
// Drop from GNOME or kde
// delimited by \n (\r\n) on gnome
// will need to remove file:// at start
else if (DataFlavor.stringFlavor.equals(flavors[i])) {
if (t.getTransferData(DataFlavor.stringFlavor)
instanceof String) {
String path = (String) t
.getTransferData(DataFlavor.stringFlavor);
List<File> fileList = convertStringsToFileList(path);
//YOUR CODE here to process the list of Files
}
}
}
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* converts Strings in certain format to a FileList
* @param filestr the list of files in a single string
* @return a list of files
*/
private ArrayList<File> convertStringsToFileList(String filestr) {
ArrayList<File> files = new ArrayList<File>();
String[] tokenizedFiles = filestr.split("\n");
for (int i = 0; i < tokenizedFiles.length; i++) {
String path = tokenizedFiles[i];
if (path.startsWith("file://")) {
if (path.endsWith("\r")) {
//appears to be the case for gnome but not kde
path = path.substring(7);
path = path.replaceAll("\r", "");
path = path.replaceAll("%20", " ");
} else {
path = path.substring(7);
}
}
files.add(new File(path));
}
return files;
}
/**
* Determine if it can import certain flavor
*
* @param flavors an array of DataFlavors
* @return true or not depending on the flavor
*/
public boolean canImport(DataFlavor[] flavors) {
for (int i = 0; i < flavors.length; i++) {
if (DataFlavor.javaFileListFlavor.equals(flavors[i])) {
return true;
} else if (DataFlavor.stringFlavor.equals(flavors[i])) {
return true;
}
}
return false;
}
/**
* method that is called when the drag starts or enters the window
* @param dtde a DropTargetDragEvent
*
* @see java.awt.dnd.DropTargetListener#dragEnter(java.awt.dnd.DropTargetDragEvent)
*/
public void dragEnter(DropTargetDragEvent dtde) {
//DEBUG
//System.out.println("dragEnter" + ":" + dtde) ;
}
/**
* a method that is called when the DRAG is OVER ??
*
* @see java.awt.dnd.DropTargetListener#dragOver(java.awt.dnd.DropTargetDragEvent)
*/
public void dragOver(DropTargetDragEvent dtde) {
// DEBUG
//System.out.println("dragOver" + ":" + dtde) ;
}
/**
* when the drop action is changes this method is called
*
* @see java.awt.dnd.DropTargetListener#dropActionChanged(java.awt.dnd.DropTargetDragEvent)
*/
public void dropActionChanged(DropTargetDragEvent dtde) {
// DEBUG
//System.out.println("dropActionChanged" + ":" + dtde) ;
}
/**
* method called when the drag exits the window
*
* @see java.awt.dnd.DropTargetListener#dragExit(java.awt.dnd.DropTargetEvent)
*/
public void dragExit(DropTargetEvent dte) {
// DEBUG
//System.out.println("dragExit" + ":" + dte) ;
}
}
@camickr作为答案说的是一个例子,我更新了代码,以便它只使用标准API。在这里查找说你的代码的行来处理文件列表 – 2015-07-05 01:08:17
我不认为异常由部分代码抛出了我已删除的习惯或具体细节你已包括在内。请检查例外的行号,并将相关部分的代码添加到您的问题中。 – Pops 2011-05-23 19:04:23
你为什么要返回一个ArrayList?我不是很熟悉java的这个领域,但考虑到异常涉及从ArrayList转换......也许尝试直接返回'file'? – ApproachingDarknessFish 2013-03-19 18:08:36