Code
class DragHandler extends MouseAdapter{
private final JWindow window = new JWindow();
private Component draggingComonent = null;
private int index = -1;
private Component gap = Box.createHorizontalStrut(24);
private Point startPt = null;
private int gestureMotionThreshold = DragSource.getDragThreshold();
public DragHandler() {
window.setBackground(new Color(0, true));
}
@Override public void mousePressed(MouseEvent e) {
JComponent parent = (JComponent)e.getComponent();
if(parent.getComponentCount()<=1) {
startPt = null;
return;
}
startPt = e.getPoint();
}
@Override
public void mouseDragged(MouseEvent e) {
Point pt = e.getPoint();
JComponent parent = (JComponent)e.getComponent();
int t = Math.sqrt(Math.pow(pt.x-startPt.x, 2)+Math.pow(pt.y-startPt.y, 2))
if(startPt != null && t>gestureMotionThreshold) {
startPt = null;
Component c = parent.getComponentAt(pt);
index = parent.getComponentZOrder(c);
if(c == parent || index < 0) {
return;
}
draggingComonent = c;
parent.remove(draggingComonent);
parent.add(gap, index);
parent.revalidate();
parent.repaint();
window.add(draggingComonent);
window.pack();
Dimension d = draggingComonent.getPreferredSize();
Point p = new Point(pt.x - d.width/2, pt.y - d.height/2);
SwingUtilities.convertPointToScreen(p, parent);
window.setLocation(p);
window.setVisible(true);
return;
}
if(!window.isVisible() || draggingComonent==null) {
return;
}
Dimension d = draggingComonent.getPreferredSize();
Point p = new Point(pt.x - d.width/2, pt.y - d.height/2);
SwingUtilities.convertPointToScreen(p, parent);
window.setLocation(p);
for(int i=0; i=0 ? i : 0;
parent.remove(gap);
parent.add(gap, n);
parent.revalidate();
parent.repaint();
return;
}else if(r2.contains(pt)) {
if(c==gap) {
return;
}
parent.remove(gap);
parent.add(gap, i);
parent.revalidate();
parent.repaint();
return;
}
}
parent.remove(gap);
parent.revalidate();
parent.repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
startPt = null;
if(!window.isVisible() || draggingComonent==null) {
return;
}
Point pt = e.getPoint();
JComponent parent = (JComponent)e.getComponent();
Component cmp = draggingComonent;
draggingComonent = null;
window.setVisible(false);
for(int i=0; i=0 ? i : 0;
parent.remove(gap);
parent.add(cmp, n);
parent.revalidate();
parent.repaint();
return;
}else if(r2.contains(pt)) {
parent.remove(gap);
parent.add(cmp, i);
parent.revalidate();
parent.repaint();
return;
}
}
if(parent.getBounds().contains(pt)) {
parent.remove(gap);
parent.add(cmp);
}else{
parent.remove(gap);
parent.add(cmp, index);
}
parent.revalidate();
parent.repaint();
}
}
References