Code
MouseAdapter hsl1 = new HandScrollListener();
vport.addMouseMotionListener(hsl1);
vport.addMouseListener(hsl1);
MouseAdapter hsl2 = new DragScrollListener();
label.addMouseMotionListener(hsl2);
label.addMouseListener(hsl2);
class HandScrollListener extends MouseAdapter {
private final Cursor defCursor = Cursor.getDefaultCursor();
private final Cursor hndCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
private final Point pp = new Point();
@Override public void mouseDragged(MouseEvent e) {
JViewport vport = (JViewport) e.getComponent();
Point cp = e.getPoint();
Rectangle rect = vport.getViewRect();
rect.translate(pp.x - cp.x, pp.y - cp.y);
label.scrollRectToVisible(rect);
pp.setLocation(cp);
}
@Override public void mousePressed(MouseEvent e) {
e.getComponent().setCursor(hndCursor);
pp.setLocation(e.getPoint());
}
@Override public void mouseReleased(MouseEvent e) {
e.getComponent().setCursor(defCursor);
}
}
class DragScrollListener extends MouseAdapter {
private final Cursor defCursor = Cursor.getDefaultCursor();
private final Cursor hndCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
private final Point pp = new Point();
@Override public void mouseDragged(MouseEvent e) {
Component c = e.getComponent();
Container p = SwingUtilities.getUnwrappedParent(c);
if (p instanceof JViewport) {
JViewport viewport = (JViewport) p;
Point cp = SwingUtilities.convertPoint(c, e.getPoint(), viewport);
Rectangle rect = viewport.getViewPosition();
rect.translate(pp.x - cp.x, pp.y - cp.y);
((JComponent) c).scrollRectToVisible(rect);
pp.setLocation(cp);
}
}
@Override public void mousePressed(MouseEvent e) {
Component c = e.getComponent();
c.setCursor(hndCursor);
Container p = SwingUtilities.getUnwrappedParent(c);
if (p instanceof JViewport) {
JViewport viewport = (JViewport) p;
Point cp = SwingUtilities.convertPoint(c, e.getPoint(), viewport);
pp.setLocation(cp);
}
}
@Override public void mouseReleased(MouseEvent e) {
e.getComponent().setCursor(defCursor);
}
}
References
Hi,
ReplyDeleteyour article was very helpful to me. But i am facing a problem when dealing with JTabbedPane. I am unable to drag when i place a JTabbedPane in the Panel. Please help me.
Thanks
Anita
Hi Anita,
ReplyDeleteThis HandScrollListener(DragScrollListener) is not intended for the nested Component.
So how about using the JLayer: DragScrollLayerTest.java
Hi,
ReplyDeleteThank you very much. You made it very simpler :)
Thanks,
Anita