Drag and Drop Copy von Componenten

profiler84

Grünschnabel
Hallo,

Mit folgendem Code mache ich 2 JFrames und versuche 1 JButton zu kopieren:

Aber irgendwie wird meine Komponente immer verschoben von Frame zu Frame, ansttatt zu Kopieren.
Hat "DnDConstants.ACTION_COPY" in diesem Fall überhaupt eine wirkung?

Danke.
Code:
package Draganddrop;

import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import javax.swing.*;
import java.awt.event.*;
public class DragDrop implements DragGestureListener, 
DragSourceListener,
        DropTargetListener, Transferable {

    static final DataFlavor[] supportedFlavors = {null};
    

    static {
        try {
            supportedFlavors[0] = new 
            DataFlavor(DataFlavor.javaJVMLocalObjectMimeType);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    Object object;
    // Transferable methods.
    public Object getTransferData(DataFlavor flavor) {
        if (flavor.isMimeTypeEqual
            (DataFlavor.javaJVMLocalObjectMimeType)) {
            return object;
        } else {
            return null;
        }
    }

    public DataFlavor[] getTransferDataFlavors() {
        return supportedFlavors;
    }

    public boolean isDataFlavorSupported(DataFlavor flavor) {
        return flavor.isMimeTypeEqual
        (DataFlavor.javaJVMLocalObjectMimeType);
    }
    // DragGestureListener method.
    public void dragGestureRecognized(DragGestureEvent ev) {
        ev.startDrag(null, this, this);
    }
    // DragSourceListener methods.
    public void dragDropEnd(DragSourceDropEvent ev) {
    }

    public void dragEnter(DragSourceDragEvent ev) {
    }

    public void dragExit(DragSourceEvent ev) {
    }

    public void dragOver(DragSourceDragEvent ev) {
        object = ev.getSource();
    }

    public void dropActionChanged(DragSourceDragEvent ev) {
    }
    // DropTargetListener methods.
    public void dragEnter(DropTargetDragEvent ev) {
    }

    public void dragExit(DropTargetEvent ev) {
    }

    public void dragOver(DropTargetDragEvent ev) {
        dropTargetDrag(ev);
    }

    public void dropActionChanged(DropTargetDragEvent ev) {
        dropTargetDrag(ev);
    }

    void dropTargetDrag(DropTargetDragEvent ev) {
        ev.acceptDrag(ev.getDropAction());
    }

    public void drop(DropTargetDropEvent ev) {
        ev.acceptDrop(ev.getDropAction());
        try {
            Object target = ev.getSource();
            Object source = ev.getTransferable().getTransferData
                            (supportedFlavors[0]);
            Component component = ((DragSourceContext) 
                                    source).getComponent();
            Container oldContainer = component.getParent();
            Container container = (Container) ((DropTarget) 
                                   target).getComponent();
            container.add(component);
            oldContainer.validate();
            oldContainer.repaint();
            container.validate();
            container.repaint();
        } 
        catch (Exception ex) {
            ex.printStackTrace();
        }
        ev.dropComplete(true);
    }

    public static void main(String[] arg) {
        JButton button = new JButton("Drag this button");

        JFrame source = new JFrame("Source Frame");
        source.setLayout(new FlowLayout());
        source.add(button);

        JFrame target = new JFrame("Target Frame");
        target.setLayout(new FlowLayout());

        DragDrop dndListener = new DragDrop();

        DragSource dragSource = new DragSource();
        DropTarget dropTarget1 = new DropTarget(source, 
        DnDConstants.ACTION_COPY, dndListener);
        DropTarget dropTarget2 = new DropTarget(target, 
        DnDConstants.ACTION_COPY, 
                dndListener);
        DragGestureRecognizer dragRecognizer1 = dragSource.
                createDefaultDragGestureRecognizer(button, 
                DnDConstants.ACTION_COPY, dndListener);

        source.setBounds(0, 200, 200, 200);
        target.setBounds(220, 200, 200, 200);
        source.pack();
        source.setVisible(true);
        target.pack();
        target.setVisible(true);
        
        
    }
}
 
Hallo,

diese Konstante hat damit nichts zu tun, die Logik musst du selbst implementieren.

Gruß

Sascha
 
Hallo,

Danke für die rasche Antwort. Kannst du mir vielleicht verraten, wo in dem Code die alte Komponente entfernt wird?
Bzw. wo ich diese copy paste logik selber entwerfen kann?
 
Du entfernst sie weil du die Component einem anderen Container zuweist.
Du müsstest den Button kopieren, also einen neuen Button anlegen mit den gleichen Einstellungen.

Gruß

Sascha
 

Neue Beiträge

Zurück