• category: swing folder: HandScroll title: JScrollPaneのViewportをマウスで掴んでスクロール tags: [JScrollPane, JViewport, MouseListener, MouseMotionListener, JLabel] author: aterai pubdate: 2006-01-02T06:45:45+09:00 description: JScrollPaneの窓の中をマウスで掴んで画像をスクロールします。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTNqjajfcI/AAAAAAAAAbI/Km-h7tWdYOo/s800/HandScroll.png hreflang:
       href: https://java-swing-tips.blogspot.com/2009/03/mouse-dragging-viewport-scroll.html
       lang: en

概要

JScrollPaneの窓の中をマウスで掴んで画像をスクロールします。

サンプルコード

class HandScrollListener extends MouseAdapter {
  private final Cursor defCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
  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();
    Point vp = vport.getViewPosition();
           //= SwingUtilities.convertPoint(vport, 0, 0, label);
    vp.translate(pp.x - cp.x, pp.y - cp.y);
    //if (r1.isSelected()) {
    label.scrollRectToVisible(new Rectangle(vp, vport.getSize()));
    //} else {
    //  vport.setViewPosition(vp);
    //}
    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);
  }
}
View in GitHub: Java, Kotlin

解説

JViewportの原点(左上)をマウスの移動に応じて変更し、JComponent#scrollRectToVisibleメソッドの引数として使用することで、覗き窓のスクロールを行っています。


JComponent#scrollRectToVisible(...)ではなく、JViewport#setViewPosition(Point)を使用すると、内部コンポーネントの外側に移動することができます。

参考リンク

コメント