【发布时间】:2011-09-05 16:57:10
【问题描述】:
我有一个 JEditorPane 并覆盖了默认的拖动处理程序。在此过程中,我删除了 Text 的所有默认拖放行为。
我希望用户能够从网络浏览器或其他任何东西将文本拖到控件中,然后对其执行一些操作。下面是我到目前为止的代码。文件拖放工作正常,但是,如果我将文本放入其中(例如从网站上),我会得到 java.lang.ClassCastException: java.io.StringReader cannot be cast to java.io.InputStream 如果我将其更改为字符串阅读器,我会得到 java.lang.ClassCastException: sun.awt.datatransfer.DataTransferer$ReencodingInputStream cannot be cast to 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
}
}
【问题讨论】: