import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.IOException;
import javax.swing.*;
import javax.swing.border.LineBorder;
public class TestBox extends JPanel implements MouseListener,
MouseMotionListener {
private JLayeredPane myPanel;
private LineBorder backgroundBorder, activeBorder;
private JPanel upperPanel;
private JLabel label;
private JList list;
private DefaultListModel listModel;
private JScrollPane listScroll;
private boolean active = false;
private int originalLayer;
private Point offsetPoint = null;
private String title;
private Color activeColor = Color.ORANGE;
private Color backgroundColor = Color.GRAY;
public TestBox(JLayeredPane panel, int id) {
backgroundBorder = new LineBorder(backgroundColor,3,true);
activeBorder = new LineBorder(activeColor,3,true);
setBorder(backgroundBorder);
myPanel = panel;
addMouseListener(this);
addMouseMotionListener(this);
title = ""+id;
initialize();
}
public void initialize() {
setSize(300,200);
upperPanel = new JPanel();
label = new JLabel(title);
upperPanel.add(label);
listModel = new DefaultListModel();
listModel.addElement("abc - "+title);
listModel.addElement("def - "+title);
listModel.addElement("ghi - "+title);
list = new JList(listModel);
list.addMouseListener(this);
list.setDragEnabled(true);
list.setTransferHandler(new MyTransferHandler());
listScroll = new JScrollPane(list);
setLayout(new BorderLayout());
add(upperPanel,BorderLayout.NORTH);
add(listScroll, BorderLayout.SOUTH);
setVisible(true);
}
public void mouseClicked(MouseEvent e) {
setActive(true);
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
// Drag and drop
public void mousePressed(MouseEvent e) {
setActive(true);
originalLayer = JLayeredPane.getLayer(this);
// Zum Verschieben (Drag) auf den
// Drag-Layer verschieben
myPanel.setLayer(this, JLayeredPane.DRAG_LAYER.intValue());
// offsetPoint innerhalb der Box ermitteln
// Wenn offsetPoint != null ist, wird die Box bewegt
offsetPoint = new Point(e.getPoint().x, e.getPoint().y);
}
public void mouseReleased(MouseEvent e) {
// Zurück auf die ursprüngliche Ebene, aber zuvorderst
myPanel.setLayer(this, originalLayer);
setActive(true);
// offsetPoint auf null setzen ->
// Kein Dragging
offsetPoint = null;
}
public void mouseDragged(MouseEvent e) {
// Wenn der offsetPoint != null ist (also die
// Box per Drag bewegt wird), wird die Box
// um die neue Differenz verschoben
boolean xBorderReached = false;
boolean yBorderReached = false;
int diffX = e.getX() - offsetPoint.x;
int diffY = e.getY() - offsetPoint.y;
int targetX = this.getX() + diffX;
int targetY = this.getY() + diffY;
((JLayeredPane) this.getParent()).moveToFront(this);
if (targetX < 0) {
xBorderReached = true;
}
if (targetY < 0) {
yBorderReached = true;
}
if (offsetPoint != null) {
targetX = this.getX() + diffX;
if (xBorderReached) {
targetX = this.getX();
}
targetY = this.getY() + diffY;
if (yBorderReached) {
targetY = this.getY();
}
this.setLocation(targetX, targetY);
}
validate();
repaint();
}
public void mouseMoved(MouseEvent e) {}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
if (active) {
myPanel.moveToFront(this);
list.setEnabled(true);
setBackground(activeColor);
upperPanel.setBackground(activeColor);
setBorder(activeBorder);
Component[] c = myPanel.getComponents();
for (int i = 0; i < c.length; i++) {
TestBox box = (TestBox) c[i];
if(box!=this){
box.setActive(false);
}
}
} else {
myPanel.moveToBack(this);
setBorder(backgroundBorder);
list.setEnabled(false);
setBackground(backgroundColor);
upperPanel.setBackground(backgroundColor);
}
}
public JList getList() {
return list;
}
public void setList(JList list) {
this.list = list;
}
public class MyTransferHandler extends TransferHandler{
private int[] indices = null;
private int addIndex = -1; //Location where items were added
private int addCount = 0; //Number of items added.
protected Transferable createTransferable(JComponent c) {
return new StringSelection(exportString(c));
}
public int getSourceActions(JComponent c) {
return MOVE;
}
public boolean importData(JComponent c, Transferable t) {
if (canImport(c, t.getTransferDataFlavors())) {
try {
String str = (String)t.getTransferData(DataFlavor.stringFlavor);
importString(c, str);
return true;
} catch (UnsupportedFlavorException ufe) {
ufe.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
}
return false;
}
protected void exportDone(JComponent c, Transferable data, int action) {
cleanup(c, action == MOVE);
}
public boolean canImport(JComponent c, DataFlavor[] flavors) {
for (int i = 0; i < flavors.length; i++) {
if (DataFlavor.stringFlavor.equals(flavors[i])) {
return true;
}
}
return false;
}
protected String exportString(JComponent c) {
JList list = (JList)c;
indices = list.getSelectedIndices();
Object[] values = list.getSelectedValues();
StringBuffer buff = new StringBuffer();
for (int i = 0; i < values.length; i++) {
Object val = values[i];
buff.append(val == null ? "" : val.toString());
if (i != values.length - 1) {
buff.append("\n");
}
}
return buff.toString();
}
protected void importString(JComponent c, String str) {
JList target = (JList)c;
DefaultListModel listModel = (DefaultListModel)target.getModel();
int index = target.getSelectedIndex();
if (indices != null && index >= indices[0] - 1 &&
index <= indices[indices.length - 1]) {
indices = null;
return;
}
int max = listModel.getSize();
if (index < 0) {
index = max;
} else {
index++;
if (index > max) {
index = max;
}
}
addIndex = index;
String[] values = str.split("\n");
addCount = values.length;
for (int i = 0; i < values.length; i++) {
listModel.add(index++, values[i]);
}
}
protected void cleanup(JComponent c, boolean remove) {
if (remove && indices != null) {
JList source = (JList)c;
DefaultListModel model = (DefaultListModel)source.getModel();
if (addCount > 0) {
for (int i = 0; i < indices.length; i++) {
if (indices[i] > addIndex) {
indices[i] += addCount;
}
}
}
for (int i = indices.length - 1; i >= 0; i--) {
model.remove(indices[i]);
}
}
indices = null;
addCount = 0;
addIndex = -1;
}
}
}