Перетаскивание текста в Java с помощью DropTargetListener - PullRequest
1 голос
/ 05 сентября 2011

У меня есть JEditorPane и я переопределил обработчик перетаскивания по умолчанию.В процессе я удалил все стандартные функции перетаскивания для Text.

Я хочу, чтобы пользователь мог перетаскивать текст в элемент управления из веб-браузера или чего-либо еще, а затем выполнять над ним некоторые операции.Ниже приведен код, который я до сих пор.Перетаскивание файла работает нормально, однако, если я перетаскиваю в него текст (скажем, с веб-сайта), я получаю java.lang.ClassCastException: java.io.StringReader cannot be cast to java.io.InputStream, если я изменяю его на String Reader, я получаю 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 Ответ

1 голос
/ 05 сентября 2011

реализовали ли вы Transferable, который поддерживает 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));
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...