首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java通过DropTargetListener拖放文本

Java通过DropTargetListener拖放文本
EN

Stack Overflow用户
提问于 2011-09-05 16:36:13
回答 1查看 2K关注 0票数 1

我有一个JEditorPane,并覆盖了默认的拖动处理程序。在这个过程中,我删除了文本的所有默认拖放行为。

我希望用户能够将文本从web浏览器或其他任何东西拖动到控件中,然后对其执行一些操作。下面是我到目前为止拥有的代码。文件拖放工作正常,但是,如果我将文本拖放到其中(例如从网站),我将获得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

代码语言:javascript
复制
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

    }

}
EN

回答 1

Stack Overflow用户

发布于 2011-09-05 16:57:10

您是否实现了支持PlainText或String的Transferable?

例如,下面的可转移代码可能会很有用:

代码语言:javascript
复制
  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));
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7305628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档