TITLE:JScrollPaneのViewPortをマウスで掴んでスクロール

Posted by terai at 2006-01-02

JScrollPaneのViewPortをマウスで掴んでスクロール

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

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

class HandScrollListener extends MouseInputAdapter {
  private final Rectangle rect = new Rectangle();
  private final Cursor defCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
  private final Cursor hndCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
  private int startX, startY;
  @Override
  public void mouseDragged(final MouseEvent e) {
    Rectangle vr = vport.getViewRect();
    int w = vr.width;
    int h = vr.height;
    int x = e.getX();
    int y = e.getY();
    Point pt = SwingUtilities.convertPoint(vport,0,0,label);
    rect.setRect(pt.x-x+startX, pt.y-y+startY, w, h);
    label.scrollRectToVisible(rect);
    startX = x;
    startY = y;
  }
  @Override
  public void mousePressed(MouseEvent e) {
    startX = e.getX();
    startY = e.getY();
    label.setCursor(hndCursor);
  }
  @Override
  public void mouseReleased(MouseEvent e) {
    label.setCursor(defCursor);
    label.repaint();
  }
}

解説

JViewportの原点(左上)をSwingUtilities.convertPointメソッドを使って中のJLabel(画像)の座標に変換し、これを基準座標としています。この座標をマウスの移動に応じて変更し、JComponent#scrollRectToVisibleメソッドの引数として使用することで、覗き窓のスクロールを行っています。

参考リンク

コメント

  • つかんで移動ということですが、移動方向が逆の気がします。 -- 名無し
    • ご指摘ありがとうございます。確かに逆ですね。画像を掴んでというより、スクロールバーを掴んでみたいな動きになってました。修正しておきます。 -- terai