你能拖放一个JButton副本吗?

时间:2015-06-28 20:23:59

标签: drag-and-drop copy jbutton move

找到了一个简洁的样本,它真正有助于说明DnD在从列表中拖动值并将其放在面板上时的工作原理。

此示例获取列表值的副本。

我已经修改了示例以添加JButton。我可以将它放到面板上,但它移动它而不是制作副本。

为什么JButton被移动而不是复制有什么特定的东西? 复制按钮而不是移动按钮需要进行哪些更改? 我甚至尝试按下CTRL键,因为我拖动按钮但仍然移动它而不是复制。

import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.IOException;
import javax.swing.*;

public class TestDnD {

public static void main(String[] args) {
    new TestDnD();
}

public TestDnD() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException ex) {
            } catch (InstantiationException ex) {
            } catch (IllegalAccessException ex) {
            } catch (UnsupportedLookAndFeelException ex) {
            }

            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(new TestPane());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }

    });
}

public class TestPane extends JPanel {

    private JList list;

    public TestPane() {
        setLayout(new BorderLayout());
        list = new JList();
        DefaultListModel model = new DefaultListModel();
        model.addElement(new User("Shaun"));
        model.addElement(new User("Andy"));
        model.addElement(new User("Luke"));
        model.addElement(new User("Han"));
        model.addElement(new User("Liea"));
        model.addElement(new User("Yoda"));
        list.setModel(model);
        add(new JScrollPane(list), BorderLayout.WEST);

        //Without this call, the application does NOT recognize a drag is happening on the LIST.
        DragGestureRecognizer dgr = DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(
                        list,
                        DnDConstants.ACTION_COPY_OR_MOVE,
                        new DragGestureHandler(list));  ///DragGestureHandler - is defined below 
                                                        ///and really just implements DragGestureListener
                                                        ///and the implemented method defines what is being transferred.

        JPanel panel = new JPanel(new GridBagLayout());
        add(panel);

        //This registers the Target (PANEL) where the Drop is to occur. 
        DropTarget dt = new DropTarget(
                        panel,
                        DnDConstants.ACTION_COPY_OR_MOVE,
                        new DropTargetHandler(panel), ////DropTargetHandler - is defined below 
                        true);                        ///and really just implements DropTargetListener

        setupButtonTest();

    }

    private void setupButtonTest()
    {
        JButton myButton = new JButton("Drag Drop Me");
        add(myButton, BorderLayout.NORTH);

        DragGestureRecognizer dgr = DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(
                myButton,
                DnDConstants.ACTION_COPY, //  ACTION_COPY_OR_MOVE,
                new DragGestureHandler(myButton));  ///DragGestureHandler - is defined below 
                                                ///and really just implements DragGestureListener
                                                ///and the implemented method defines what is being transferred.

        }


}

public static class User {

    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return name;
    }

}


////This Class handles the actual item or data being transferred (dragged).

public static class UserTransferable implements Transferable {

    public static final DataFlavor JIMS_DATA_FLAVOR = new DataFlavor(User.class, "User");
    private User user;
    private JButton jbutton;

    public UserTransferable(User user) {
        this.user = user;
    }

    public UserTransferable(JButton user) {
        this.jbutton = user;
    }

    @Override
    public DataFlavor[] getTransferDataFlavors() {
        //Executed as soon as the User Object is dragged. 
        System.out.println("UserTransferable : getTransferDataFlavors()");
        return new DataFlavor[]{JIMS_DATA_FLAVOR};
    }

    @Override
    public boolean isDataFlavorSupported(DataFlavor flavor) {
        //This is what is executed once the item is dragged into a JComponent that can accept it. 
        System.out.println("UserTransferable : isDataFlavorSupported()");
        return JIMS_DATA_FLAVOR.equals(flavor);
    }

    @Override
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
        //Once a Drop is done then this method provides the data to actually drop. 
        System.out.println("UserTransferable : getTransferData()");
        Object value = null;
        if (JIMS_DATA_FLAVOR.equals(flavor)) {
            if (user != null)
                    value = user;
            else if (jbutton != null)
                value = jbutton;
        } else {
            throw new UnsupportedFlavorException(flavor);
        }
        return value;
    }

}

protected class DragGestureHandler implements DragGestureListener {

    private JList list;
    private JButton button;

    public DragGestureHandler(JList list) {
        this.list = list;
    }

    public DragGestureHandler(JButton list) {
        this.button = list;
    }

    @Override
    public void dragGestureRecognized(DragGestureEvent dge) {
        //This executes once the dragging starts. 
        System.out.println("DragGestureHandler : dragGesturRecognized()");
        if (dge.getComponent() instanceof JList)
        {
            Object selectedValue = list.getSelectedValue();
            if (selectedValue instanceof User) {
                User user = (User) selectedValue;
                Transferable t = new UserTransferable(user);  ////This is where you define what is being transferred. 
                DragSource ds = dge.getDragSource();
                ds.startDrag(
                                dge,
                                null,
                                t,
                                new DragSourceHandler());
            }
        }
        else if (dge.getComponent() instanceof JButton)
        {
            Object selectedValue = dge.getComponent();
            if (selectedValue instanceof JButton) {
                JButton jb = button; 
                Transferable t = new UserTransferable(jb);  ////This is where you define what is being transferred. 
                DragSource ds = dge.getDragSource();
                ds.startDrag(
                                dge,
                                null,
                                t,
                                new DragSourceHandler());
            }
        }

    }

}

protected class DragSourceHandler implements DragSourceListener {

    public void dragEnter(DragSourceDragEvent dsde) {
        //This means you have entered a possible Target. 
        System.out.println("DragSourceHandler : DragEnter()");
    }

    public void dragOver(DragSourceDragEvent dsde) {
        //Continually executes while the DRAG is hovering over an potential TARGET.
        System.out.println("DragSourceHandler : DragOver()");
    }

    public void dropActionChanged(DragSourceDragEvent dsde) {

    }

    public void dragExit(DragSourceEvent dse) {
        //Executes once the potential target has been exited. 
        System.out.println("DragSourceHandler : DragExit()");
    }

    public void dragDropEnd(DragSourceDropEvent dsde) {
        //Once the mouse button is lifted to do the drop.
        //Executes against any potential drop.
        System.out.println("DragSourceHandler : dragDropEnd()");

    }

}


protected class DropTargetHandler implements DropTargetListener {
////THESE ARE EXECUTED ONLY WHEN THE MOUSE AND DRAGGED ITEM IS OVER THE TARGET.
    private JPanel panel;

    public DropTargetHandler(JPanel panel) {
        this.panel = panel;
    }

    public void dragEnter(DropTargetDragEvent dtde) {
        System.out.println("DropTargetHandler : dragEnter()");
        if (dtde.getTransferable().isDataFlavorSupported(UserTransferable.JIMS_DATA_FLAVOR)) {
            //This shows the outline within the TARGET to indicate it will accept the DROP.
            System.out.println("     Accept...");
            dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
        } else {
            //If an item is not registered to accept a certain drop this is executed. 
            System.out.println("     DropTargetHandler : DragEnter() - Else");
            dtde.rejectDrag();
        }
    }

    public void dragOver(DropTargetDragEvent dtde) {
        //Active while the item is being Dragged over the Target
        System.out.println("DropTargetHandler : dragOver()");
    }

    public void dropActionChanged(DropTargetDragEvent dtde) {
        System.out.println("DropTargetHandler : dropActionChanged()");
    }

    public void dragExit(DropTargetEvent dte) {
        //Once the dragged item is taken out of the Target area. 
        System.out.println("DropTargetHandler : dragExit()");
    }

    public void drop(DropTargetDropEvent dtde) {
        //Once the mouse button is released to do the Drop then this is executed. 
        System.out.println("DropTargetHandler : drop()");
        if (dtde.getTransferable().isDataFlavorSupported(UserTransferable.JIMS_DATA_FLAVOR)) {
            Transferable t = dtde.getTransferable();
            if (t.isDataFlavorSupported(UserTransferable.JIMS_DATA_FLAVOR)) {
                try {
                    Object transferData = t.getTransferData(UserTransferable.JIMS_DATA_FLAVOR);
                    if (transferData instanceof User) {
                        User user = (User) transferData;
                        dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                        panel.add(new JLabel(user.getName()));
                        panel.revalidate();
                        panel.repaint();
                    } 
                    else if (transferData instanceof JButton) {
                        JButton jb = (JButton) transferData;
                        dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                        panel.add(jb);
                        panel.revalidate();
                        panel.repaint();
                    }
                    else {
                        dtde.rejectDrop();
                    }
                } catch (UnsupportedFlavorException ex) {
                    ex.printStackTrace();
                    dtde.rejectDrop();
                } catch (IOException ex) {
                    ex.printStackTrace();
                    dtde.rejectDrop();
                }
            } else {
                dtde.rejectDrop();
            }
        }
    }

}

}

0 个答案:

没有答案