import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
class PanelDragDrop
{
public static void main(String args[])
{
JFrame frame = new JFrame();
JPanel panel = new JPanel();
DefaultListModel model = new DefaultListModel();
JPanel jp1 = new JPanel();
jp1.add(new JLabel(new ImageIcon("image00.png")));
JPanel jp2 = new JPanel();
jp2.add(new JLabel(new ImageIcon("image01.png")));
JPanel jp3 = new JPanel();
jp3.add(new JLabel(new ImageIcon("image02.png")));
JPanel jp4 = new JPanel();
jp4.add(new JLabel(new ImageIcon("image03.png")));
model.addElement(jp1);
model.addElement(jp2);
model.addElement(jp3);
model.addElement(jp4);
JListWithImages jlwi = new JListWithImages(model);
// Drag&Drop aktivieren
ListTransferHandler lh = new ListTransferHandler();
jlwi.setTransferHandler(lh);
jlwi.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jlwi.setDragEnabled(true);
jlwi.setDropMode(DropMode.INSERT);
lh = new ListTransferHandler();
jp4 = new JPanel();
jp4.add(new JLabel(new ImageIcon("image03.png")));
model = new DefaultListModel();
model.addElement(jp4);
JListWithImages jlwi2 = new JListWithImages(model);
jlwi2.setTransferHandler(lh);
jlwi2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jlwi2.setDragEnabled(true);
jlwi2.setDropMode(DropMode.ON_OR_INSERT);
panel.setLayout(new GridLayout(1,0));
panel.add(jlwi);
panel.add(jlwi2);
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
}
class JListWithImages extends JList {
public JListWithImages(ListModel model)
{
super(model);
setCellRenderer(new CustomCellRenderer());
}
class CustomCellRenderer implements ListCellRenderer {
public Component getListCellRendererComponent
(JList list, Object value, int index,
boolean isSelected,boolean cellHasFocus) {
Component component = (Component)value;
component.setBackground
(isSelected ? Color.black : Color.white);
component.setForeground
(isSelected ? Color.white : Color.black);
return component;
}
}
}
class ObjectTransferable implements Transferable
{
public static DataFlavor flavor = new DataFlavor(Object.class, "Object");
private Object object;
public ObjectTransferable(Object object)
{
this.object = object;
}
public Object getTransferData(DataFlavor flavor)
{
return object;
}
public DataFlavor[] getTransferDataFlavors()
{
return new DataFlavor[]{flavor};
}
public boolean isDataFlavorSupported(DataFlavor flavor)
{
return true;
}
}
class ListTransferHandler extends TransferHandler {
/**
* Perform the actual data import.
*/
public boolean importData(TransferHandler.TransferSupport info) {
Object data = null;
//If we can't handle the import, bail now.
if (!canImport(info)) {
return false;
}
JList list = null;
DefaultListModel model = null;
try
{
list = (JList)info.getComponent();
model = (DefaultListModel)(list.getModel());
} catch (Exception ioe) {
ioe.printStackTrace();
return false;
}
//Fetch the data -- bail if this fails
try {
data = info.getTransferable().getTransferData(ObjectTransferable.flavor);
} catch (UnsupportedFlavorException ufe) {
System.out.println("importData: unsupported data flavor");
return false;
} catch (IOException ioe) {
System.out.println("importData: I/O exception");
return false;
} catch (Exception ioe) {
ioe.printStackTrace();
return false;
}
if (info.isDrop()) { //This is a drop
JList.DropLocation dl = (JList.DropLocation)info.getDropLocation();
int index = dl.getIndex();
if (dl.isInsert()) {
model.add(index, data);
return true;
} else {
model.set(index, data);
return true;
}
} else { //This is a paste
int index = list.getSelectedIndex();
// if there is a valid selection,
// insert data after the selection
if (index >= 0) {
model.add(list.getSelectedIndex()+1, data);
// else append to the end of the list
} else {
model.addElement(data);
}
return true;
}
}
/**
* Bundle up the data for export.
*/
protected Transferable createTransferable(JComponent c) {
JList list = (JList)c;
int index = list.getSelectedIndex();
Object value = list.getSelectedValue();
return new ObjectTransferable(value);
}
/**
* The list handles both copy and move actions.
*/
public int getSourceActions(JComponent c) {
return TransferHandler.COPY_OR_MOVE;
}
/**
* When the export is complete, remove the old list entry if the
* action was a move.
*/
protected void exportDone(JComponent c, Transferable data, int action) {
if (action != MOVE) {
return;
}
JList list = (JList)c;
DefaultListModel model = (DefaultListModel)list.getModel();
int index = list.getSelectedIndex();
model.remove(index);
}
/**
* We only support importing strings.
*/
public boolean canImport(TransferHandler.TransferSupport support) {
return true;
}
}