import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;
public class InventoryListExample
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Vector<Item> listData = new Vector<Item>();
for (int i=0; i<20; i++)
{
listData.add(new Item(String.valueOf(i)));
}
JList inventoryList = new JList(listData);
inventoryList.setCellRenderer(new DefaultListCellRenderer()
{
private static final long serialVersionUID = 7455382937012501303L;
{
setHorizontalAlignment(JLabel.CENTER);
setPreferredSize(new Dimension(160,60));
}
@Override
public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus)
{
super.getListCellRendererComponent(
list, value, index, isSelected, cellHasFocus);
Item item = (Item)value;
setText("");
setIcon(new ImageIcon(item.getImage()));
return this;
}
});
inventoryList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
inventoryList.setDragEnabled(true);
inventoryList.setTransferHandler(new ItemTransferHandler());
JScrollPane scrollPane = new JScrollPane(inventoryList);
scrollPane.setBorder(BorderFactory.createTitledBorder("Inventory"));
JPanel panel = new JPanel(new GridLayout(0,2));
panel.add(scrollPane);
panel.add(new DropArea());
f.getContentPane().add(panel);
f.pack();
f.setVisible(true);
}
static class DropArea extends JLabel implements DropTargetListener
{
private static final long serialVersionUID = -5679944858109178081L;
public DropArea()
{
super("Drop stuff here...");
@SuppressWarnings("unused")
DropTarget dropTarget = new DropTarget(this, this);
}
private void dropItem(Item item)
{
setText("Dropped here: "+item);
}
@Override
public void drop(DropTargetDropEvent e)
{
Transferable transferable = e.getTransferable();
if (transferable.isDataFlavorSupported(
TransferableItem.ITEM_FLAVOR))
{
try
{
e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
Item item = (Item)transferable.getTransferData(
TransferableItem.ITEM_FLAVOR);
dropItem(item);
}
catch (UnsupportedFlavorException ex)
{
e.rejectDrop();
}
catch (IOException ex)
{
e.rejectDrop();
}
}
else
{
e.rejectDrop();
}
e.getDropTargetContext().dropComplete(true);
}
@Override
public void dragEnter(DropTargetDragEvent e)
{
}
@Override
public void dragOver(DropTargetDragEvent e)
{
}
@Override
public void dropActionChanged(DropTargetDragEvent e)
{
}
@Override
public void dragExit(DropTargetEvent e)
{
}
}
private static class ItemTransferHandler extends TransferHandler
{
private static final long serialVersionUID = -6404485349852032912L;
@Override
public Transferable createTransferable(JComponent component)
{
JList list = (JList) component;
Object value = list.getSelectedValue();
Item item = (Item)value;
return new TransferableItem(item);
}
@Override
public int getSourceActions(JComponent c)
{
return COPY ;
}
}
private static class TransferableItem implements Transferable
{
private static final DataFlavor ITEM_FLAVOR =
new DataFlavor(Item.class, "Item");
private final Item item;
TransferableItem(Item item)
{
this.item = item;
}
@Override
public DataFlavor[] getTransferDataFlavors()
{
return new DataFlavor[]{ ITEM_FLAVOR };
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor)
{
return ITEM_FLAVOR.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException
{
if (isDataFlavorSupported(flavor))
{
return item;
}
throw new UnsupportedFlavorException(flavor);
}
}
private static class Item
{
private final String name;
private final BufferedImage image;
public Item(String name)
{
this.name = name;
image = new BufferedImage(150,50, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
g.setColor(Color.DARK_GRAY);
g.fillRect(0,0,150,50);
g.setColor(Color.LIGHT_GRAY);
g.fillRect(2,2,146,46);
g.setColor(Color.RED);
g.drawString(name, 10, 20);
g.dispose();
}
public BufferedImage getImage()
{
return image;
}
@Override
public String toString()
{
return name;
}
}
}