Drag and Drop

Ich versuche per drag and drop eine Datei in eine andere Anwendung zu ziehen. Bisher ist es mir gelungen die Datei z.B. auf den Desktop zu ziehen. Dann wird die Datei auch erstellt. Versuche ich aber z.B. ein Bild in Paint zu ziehen passiert leider gar nichts. Hier mal mein bisheriger Fortschritt:

Hier das Label des Frames, welches Drag und Drop ermöglichen soll:

getContentPane().add(dragLabel, BorderLayout.SOUTH);

DragSource ds = DragSource.getDefaultDragSource();
DragGestureRecognizer dgr = ds.createDefaultDragGestureRecognizer(dragLabel, DnDConstants.ACTION_MOVE, new FileDragGestureListener(dragLabel, imageList));

Hier der FileDragGestureListener:
Bei Drag and Drop wird das letzte Bild der Liste gespeichert und soll z.B. in Paint gezogen werden können.



    private List<BufferedImage> images;
    private Cursor cursor;
    private JLabel label;


    public FileDragGestureListener(JLabel label, List<BufferedImage> images) {
        this.label = label;
        this.images = images;
    }


    @Override
    public void dragGestureRecognized(DragGestureEvent dge) {


        // generate the tmp file
        File file = new AppHelper().saveScreenshot(images.get(images.size() - 1), "tmp.png");


        // get the right icon
        FileSystemView fsv = FileSystemView.getFileSystemView();
        Icon icn = fsv.getSystemIcon(file);


        //
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension dim = tk.getBestCursorSize(icn.getIconWidth(), icn.getIconHeight());
        BufferedImage buff = new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_INT_ARGB);
        icn.paintIcon(label, buff.getGraphics(), 0, 0);


        // set up drag image
        if (DragSource.isDragImageSupported()) {


            try {
                dge.startDrag(DragSource.DefaultCopyDrop, buff, new Point(0, 0), new TextFileTransferable(file), this);
            }
            catch (InvalidDnDOperationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }
        else {
            cursor = tk.createCustomCursor(buff, new Point(0, 0), "billybob");
            try {
                dge.startDrag(cursor, null, new Point(0, 0),


                new TextFileTransferable(file), this);
            }
            catch (InvalidDnDOperationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


    }


    @Override
    public void dragEnter(DragSourceDragEvent evt) {
        DragSourceContext ctx = evt.getDragSourceContext();
        ctx.setCursor(cursor);
    }


    @Override
    public void dragExit(DragSourceEvent evt) {
        DragSourceContext ctx = evt.getDragSourceContext();
        ctx.setCursor(DragSource.DefaultCopyDrop);
    }
}

Hier noch die Transferable Klasse:

        File temp;


        public TextFileTransferable(File temp) throws IOException {
            this.temp = temp;
        }


        public Object getTransferData(DataFlavor flavor) {
            List list = new ArrayList();
            list.add(temp);
            return list;


        }


        public DataFlavor[] getTransferDataFlavors() {
            DataFlavor[] df = new DataFlavor[1];
            df[0] = DataFlavor.javaFileListFlavor;
            return df;


        }


        public boolean isDataFlavorSupported(DataFlavor flavor) {
            if (flavor == DataFlavor.javaFileListFlavor) {
                return true;
            }
            return false;


        }
    }

… ich weiß, dass der Code noch nicht ganz sauber ist, es soll zuerst einmal funktionieren! :slight_smile:

Nach Paint scheint man nicht verschieben, sondern nur kopieren zu können. Nimm in der createDefaultDragGestureRecognizer() nicht DnDConstants.ACTION_MOVE sondern DnDConstants.ACTION_COPY beziehungsweise DnDConstants.ACTION_COPY_OR_MOVE.

Vielen Dank für den Tipp papoy. Jetzt funktioniert es überall! :lol: