2 Stimmen

Das Bild eines Symbols kann nicht von einem JLabel auf ein anderes übertragen werden

Ich möchte ein Bild von einem Symbol auf einem Jlabel ziehen, um es auf einem anderen Symbol auf einem zweiten Jlabel abzulegen. Das Problem ist, dass einige Implementierungen von Drag-and-Drop-Transferhandler-Methoden nicht aufgerufen zu werden scheinen, und ich kann das Bild nicht aus dem Symbol des ersten jlabel abrufen. Ich hoffe, Sie werden das Problem in meinem Code finden.

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); 
        }
    });
}

1voto

mKorbel Punkte 109073

Es tut mir leid, dass ich nur ein Freiwilliger bin,

ein Fehler

enter image description here

zweiter Fehler

enter image description here

dritter Fehler

enter image description here

.

dann lesen Sie bitte das Tutorial über Ziehen und Ablegen , Beispiel hier

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X