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