简体   繁体   中英

Can not transfer an image of an icon from a JLabel to another

I want to drag an image from an icon on a jlabel to drop it on another icon on a second jlabel. The problem is that some implementations of drag and drop Transferhandler methods do not seem to be called and I can not retrieve the image from the first jlabel's icon. Hope you will find the issue in my code.

class dndHandler extends TransferHandler implements Transferable {

    private final DataFlavor flavors[] = { DataFlavor.imageFlavor };

    private Image image;

        @Override
        public int getSourceActions(JComponent c) {
            System.out.println("test"); // Does not work
            return TransferHandler.COPY;
        }

        @Override
        public Transferable createTransferable(JComponent comp) {
            System.out.println("test"); // Does not work
             image = null;
             image = (Image)((ImageIcon) (((JLabel)comp).getIcon())).getImage(); //We transfer image //image stays null
             return this;
        }

        @Override
        public boolean canImport(JComponent comp, DataFlavor flavor[]) {
            if (!(comp instanceof JLabel)) {
                return false;
            }
            System.out.println("test"); //It works here
            return true;
        }

        @Override
        public boolean importData(JComponent comp, Transferable t) {
            if (comp instanceof JLabel) {

                    System.out.println(((JLabel)comp).getName()); //It works but the image is null
                    ((JLabel)comp).setIcon(new ImageIcon(image)); //The label stays empty
                    return true;
            } 
            return false;
        }

        @Override
        public Object getTransferData(DataFlavor flavor) {
            if (isDataFlavorSupported(flavor)) {
                return image;
            }
            return null;
        }

        @Override
        public DataFlavor[] getTransferDataFlavors() {
            return flavors;
        }

        @Override
        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return flavors[0].equals(flavor);
        }

    }

    MouseListener specialListener = new SpecialDragMouseAdapter();

    class SpecialDragMouseAdapter extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent evt) {
            JComponent comp = (JComponent)evt.getSource();
            TransferHandler th = comp.getTransferHandler();

            // Start the drag operation
            th.exportAsDrag(comp, evt, TransferHandler.COPY);
        }

    }

public class PrincipalFrame extends javax.swing.JFrame {

    TransferHandler dropHandler = new dndHandler();

    public PrincipalFrame()
    {
        JLabel label1 = new JLabel();
        JLabel label2 = new JLabel();

        label1.setName("label "+i+"-"+j);
        label1.setSize(50,50);
        label1.setBorder(BorderFactory.createLineBorder(java.awt.Color.black));
        label1.setIcon(new ImageIcon("put a file path on your computer"))
        label1.addMouseListener(specialListener);
        label1.setTransferHandler(dropHandler);

        label2.setName("label "+i+"-"+j);
        label2.setSize(50,50);
        label2.setBorder(BorderFactory.createLineBorder(java.awt.Color.black));
        label2.addMouseListener(specialListener);
        label2.setTransferHandler(dropHandler);
  }
}

public static void main(String args[]) {

    /*
     * Create and display the form
     */
    java.awt.EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            javax.swing.JFrame principalFrame = new PrincipalFrame();
            //Size of the window
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            principalFrame.setSize(Toolkit.getDefaultToolkit().getScreenSize().width,
                                   Toolkit.getDefaultToolkit().getScreenSize().height-40);
            //Center the window
            principalFrame.setLocation(0,0);
            principalFrame.setVisible(true); 
        }
    });
}

I'm sorry I'm only volunteer,

one error

在此处输入图片说明

second error

在此处输入图片说明

third error

在此处输入图片说明

.

then please read tutorial about Drag and Drop , example here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM