【问题标题】:Java Drag and Drop Text via DropTargetListenerJava 通过 DropTargetListener 拖放文本
【发布时间】: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

    }

}

【问题讨论】:

    标签: java swing


    【解决方案1】:

    您是否实现了支持纯文本或字符串的 Transferable?

    例如,下面的 Transferable 可能很有用:

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

    【讨论】:

    • 我仍然不明白如何将其放入上面的代码中,其中包括解析文件以及拖到控件上的文本
    猜你喜欢
    • 2013-12-02
    • 2012-03-17
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多