Ecco un esempio completo:
codice:
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;
public class TestFrame extends JFrame {
private StartDragMouseListener startDragMouseListener;
public TestFrame() {
super("Test Icon to Button Drag&Drop");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(400, 300);
startDragMouseListener = new StartDragMouseListener();
JPanel sourcePanel = new JPanel(new FlowLayout());
sourcePanel.add(createIconLabel("http://img383.imageshack.us/img383/4245/iconwink5sx.gif"));
sourcePanel.add(createIconLabel("http://img471.imageshack.us/img471/6554/iconasdhf7.gif"));
sourcePanel.add(createIconLabel("http://img214.imageshack.us/img214/4246/mame.gif"));
JPanel destinationPanel = new JPanel(new FlowLayout());
destinationPanel.setTransferHandler(new IconToPanelButtonTransferHandler());
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sourcePanel, destinationPanel);
getContentPane().add(splitPane);
}
private JLabel createIconLabel(String urlStr) {
JLabel l = new JLabel();
try {
l.setIcon(new ImageIcon(new URL(urlStr)));
l.setTransferHandler(new TransferHandler("icon"));
l.addMouseListener(startDragMouseListener);
} catch (Exception e) {
System.err.println(e);
}
return l;
}
private class StartDragMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
JComponent comp = (JComponent) e.getSource();
TransferHandler handler = comp.getTransferHandler();
handler.exportAsDrag(comp, e, TransferHandler.COPY);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TestFrame().setVisible(true);
}
});
}
}
class IconToPanelButtonTransferHandler extends TransferHandler {
public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
for (int i = 0; i < transferFlavors.length; i++) {
if (transferFlavors[i].getRepresentationClass() == Icon.class) {
return true;
}
}
return false;
}
public boolean importData(JComponent comp, Transferable t) {
DataFlavor[] transferFlavors = t.getTransferDataFlavors();
for (int i = 0; i < transferFlavors.length; i++) {
if (transferFlavors[i].getRepresentationClass() == Icon.class) {
try {
Icon receivedIcon = (Icon) t.getTransferData(transferFlavors[i]);
JButton button = new JButton(receivedIcon);
JPanel panel = (JPanel) comp;
panel.add(button);
panel.validate();
return true;
} catch (Exception e) {
System.err.println(e);
}
}
}
return false;
}
}
Il codice è un po' lungo ma spero chiaro. Vengono caricate (da URL su internet ... non sapevo cosa altro mettere ...
) delle ImageIcon messe dentro JLabel. Su questi JLabel viene impostato il drag della proprietà "icon" (quindi appunto un javax.swing.Icon).
Sul pannello di destinazione (quello sotto) viene semplicemente impostato uno speciale TransferHandler che accetta oggetti Icon e nel momento dell'import crea il JButton con la icona che poi aggiunge nel pannello (di cui ha il reference passato come JComponent).