2011-09-05 94 views
1

我有一个JEditorPane并重写了默认的拖动处理程序。在这个过程中,我删除了Text的所有默认拖放行为。Java通过DropTargetListener拖放文本

我希望用户能够从Web浏览器或其他任何地方将文本拖入控件中,然后对其执行一些操作。以下是我到目前为止的代码。 ,文件拖放工作正常,但是如果我把文本转换成它(说从网站)我得到java.lang.ClassCastException: java.io.StringReader cannot be cast to java.io.InputStream如果我改变了一个String的读者,我得到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 

    } 

} 

回答

1

已经可以实现的可转让支持PlainText或String?

例如下面的转换可能是有用的:

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)); 
    } 
+0

我还是不明白,我怎么能融入我的代码,这上面它由解析文件以及文本拖到控制 – jax