srecord noeq ComponentDragger extends MouseAdapter { Component component; MouseEvent mouseDownEvent; Component clickedOn; Pt rel; settable bool debug; // bring component to front when clicked? settable bool bringToFront; *(Component *component, MouseEvent *mouseDownEvent) {} void start { if (mouseDownEvent == null) ret; clickedOn = mouseDownEvent.getComponent(); if (bringToFront) { print("Bringing to front: " + component); componentToFront(component); repaint(getParent(component)); } rel = pt( mouseDownEvent.getXOnScreen()-component.getX(), mouseDownEvent.getYOnScreen()-component.getY()); addMouseAndMotionListener(clickedOn, this); } public void mouseDragged(MouseEvent e) { updatePosition(e); } public void mouseReleased(MouseEvent e) { if (e.getButton() != mouseDownEvent.getButton()) ret; updatePosition(e); removeMouseAdapter(clickedOn, this); if (debug) printVars("ComponentDragger done"); dragDone(); } void updatePosition(MouseEvent e) { int x = e.getXOnScreen()-rel.x, y = e.getYOnScreen()-rel.y; // safety x = max(x, 0); y = max(y, 0); updatePosition(x, y); } swappable void updatePosition(int x, int y) { if (debug) printVars("ComponentDragger", +rel, +x, +y); component.setLocation(x, y); } void dragDone {} }