Java通过DropTargetListener拖放文本
我有一个JEditorPane,并已覆盖默认的拖动处理程序。在此过程中,我删除了文本的所有默认拖放行为 我希望用户能够将文本从web浏览器或其他任何东西拖到控件中,然后对其执行一些操作。下面是我到目前为止的代码。文件拖放工作正常,但是,如果我将文本拖放到其中(比如从网站),我会得到Java通过DropTargetListener拖放文本,java,swing,Java,Swing,我有一个JEditorPane,并已覆盖默认的拖动处理程序。在此过程中,我删除了文本的所有默认拖放行为 我希望用户能够将文本从web浏览器或其他任何东西拖到控件中,然后对其执行一些操作。下面是我到目前为止的代码。文件拖放工作正常,但是,如果我将文本拖放到其中(比如从网站),我会得到java.lang.ClassCastException:java.io.StringReader无法转换为java.io.InputStream,如果我将其更改为字符串读取器,我得到java.lang.ClassCa
java.lang.ClassCastException:java.io.StringReader无法转换为java.io.InputStream
,如果我将其更改为字符串读取器,我得到java.lang.ClassCastException:sun.awt.datatransfer.datatransfer$ReencodingInputStream不能转换为java.io.StringReader
private class SpoolDragDroplistener implements DropTargetListener {
public void drop(DropTargetDropEvent event) {
// Accept copy drops
event.acceptDrop(DnDConstants.ACTION_COPY);
// Get the transfer which can provide the dropped item data
Transferable transferable = event.getTransferable();
// Get the data formats of the dropped item
DataFlavor[] flavors = transferable.getTransferDataFlavors();
// Loop through the flavors
for (DataFlavor flavor : flavors) {
try {
// If the drop items are files
if (flavor.isFlavorJavaFileListType()) {
// Get all of the dropped files
List<File> files = (List<File>) transferable
.getTransferData(flavor);
// Loop them through
for (File file : files) {
// Print out the file path
// System.out.println("File path is '" +
// file.getPath() + "'.");
//File xmlFormatFile = (File)cboXmlFiles.getSelectedItem();
String input = FileIO.getFileContents(file);
parseContents(input);
// only support one file for now
break;
}
//event.dropComplete(true);
} else if(flavor.isRepresentationClassInputStream()) {
//StringReader isr = (StringReader)transferable.getTransferData(flavor);
/******* NOT WORKING *******/
InputStreamReader isr = new InputStreamReader(((InputStream)transferable.getTransferData(flavor)),"UTF-8");
//InputStream is = (InputStream)transferable.getTransferData(flavor);
//String theString = new Scanner(is).useDelimiter("\\A").next();
//is.close();
StringBuilder sb = new StringBuilder();
int c=-1;
while( (c=isr.read()) != -1) {
sb.append((char)c);
}
parseContents(sb.toString());
}
} catch (Exception e) {
// Print out the error stack
editor.setText("ERROR: "+e.getMessage());
e.printStackTrace();
}
}
// Inform that the drop is complete
event.dropComplete(true);
}
public void dropActionChanged(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
}
public void dragEnter(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
}
public void dragExit(DropTargetEvent dte) {
// TODO Auto-generated method stub
}
public void dragOver(DropTargetDragEvent dtde) {
// TODO Auto-generated method stub
}
}
私有类SpoolDragDroplistener实现DropTargetListener{
公共作废删除(DropTargetDropEvent事件){
//接受副本删除
事件.acceptDrop(DnDConstants.ACTION\u副本);
//获取可以提供已删除项目数据的传输
可转移=event.getTransferable();
//获取已删除项的数据格式
DataFlavor[]flavors=可转移。getTransferDataFlavors();
//循环浏览各种口味
用于(数据风味:风味){
试一试{
//如果放置的项目是文件
if(flavor.isFlavorJavaFileListType()){
//获取所有删除的文件
列表文件=(列表)可转移
.getTransferData(风味);
//把它们循环一遍
用于(文件:文件){
//打印出文件路径
//System.out.println(“文件路径为”+
//file.getPath()+“.”;
//文件xmlFormatFile=(文件)cboXmlFiles.getSelectedItem();
字符串输入=FileIO.getFileContents(文件);
解析内容(输入);
//目前只支持一个文件
打破
}
//事件.dropComplete(true);
}else if(flavor.isRepresentationClassInputStream()){
//StringReader isr=(StringReader)transferable.getTransferData(flavor);
/*******不起作用*******/
InputStreamReader isr=新的InputStreamReader(((InputStream)transferable.getTransferData(flavor)),“UTF-8”);
//InputStream是=(InputStream)可转移的。getTransferData(flavor);
//字符串字符串=新扫描仪(is)。使用分隔符(\\A”).next();
//is.close();
StringBuilder sb=新的StringBuilder();
int c=-1;
而((c=isr.read())!=-1){
sb.附加((char)c);
}
解析内容(sb.toString());
}
}捕获(例外e){
//打印出错误堆栈
setText(“错误:+e.getMessage());
e、 printStackTrace();
}
}
//通知投递已完成
事件.dropComplete(true);
}
公共无效dropActionChanged(DropTargetDragEvent dtde){
//TODO自动生成的方法存根
}
公共无效dragEnter(DropTargetDragEvent dtde){
//TODO自动生成的方法存根
}
公共无效dragExit(DropTargetEvent dte){
//TODO自动生成的方法存根
}
公共无效dragOver(DropTargetDragEvent dtde){
//TODO自动生成的方法存根
}
}
您是否实现了支持纯文本或字符串的可转换文件
例如,以下内容可能有用:
public class StringTransferable implements Transferable, ClipboardOwner {
public static final DataFlavor plainTextFlavor = DataFlavor.plainTextFlavor;
public static final DataFlavor localStringFlavor = DataFlavor.stringFlavor;
public static final DataFlavor[] flavors = {
StringTransferable.plainTextFlavor,
StringTransferable.localStringFlavor
};
private static final List flavorList = Arrays.asList( flavors );
public synchronized DataFlavor[] getTransferDataFlavors() {
return flavors;
}
public boolean isDataFlavorSupported( DataFlavor flavor ) {
return (flavorList.contains(flavor));
}
您是否实现了支持纯文本或字符串的可转移程序 例如,以下内容可能有用:
public class StringTransferable implements Transferable, ClipboardOwner {
public static final DataFlavor plainTextFlavor = DataFlavor.plainTextFlavor;
public static final DataFlavor localStringFlavor = DataFlavor.stringFlavor;
public static final DataFlavor[] flavors = {
StringTransferable.plainTextFlavor,
StringTransferable.localStringFlavor
};
private static final List flavorList = Arrays.asList( flavors );
public synchronized DataFlavor[] getTransferDataFlavors() {
return flavors;
}
public boolean isDataFlavorSupported( DataFlavor flavor ) {
return (flavorList.contains(flavor));
}
我仍然不明白如何将其放入上面的代码中,该代码包括解析文件以及拖到控件上的文本。我仍然不明白如何将其放入上面的代码中,该代码包括解析文件以及拖到控件上的文本