sclass ImageSurfaceDragger extends MouseAdapter { ImageSurface is; int dx, dy; *(ImageSurface *is) { if (containsInstance(is.tools, ImageSurfaceDragger)) ret; ifclass ImageSurfaceSelector for (ImageSurfaceSelector s : collectInstances(is.tools, ImageSurfaceSelector)) { is.removeMouseListener(s); is.removeMouseMotionListener(this); is.tools.remove(s); } endif is.tools.add(this); is.addMouseListener(this); is.addMouseMotionListener(this); } public void mousePressed(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { Pt p = is.pointFromEvent(e); dx = p.x-is.getX(); dy = p.y-is.getY(); } } public void mouseDragged(MouseEvent e) { JScrollPane sp = enclosingScrollPane(is); if (sp == null) ret; Pt p = is.pointFromEvent(e); sp.getHorizontalScrollBar().setValue(p.x-dx); sp.getVerticalScrollBar().setValue(p.y-dy); } public void mouseReleased(MouseEvent e) { mouseDragged(e); } }