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

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

編集者:Terai Atsuhiro~

作成日:2006-01-02
更新日:2022-09-14 (水) 05:19:41
  • 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の窓の中をマウスで掴んで画像をスクロールします。

概要

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

サンプルコード

#spanend
#spanadd
class HandScrollListener extends MouseAdapter {
#spanend
  private final Cursor defCursor = Cursor.getDefaultCursor();
  private final Cursor hndCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
  private final Point pp = new Point();

#spandel
#screenshot
#spanend
  @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);
  }

#spandel
**サンプルコード [#e92a8d9e]
#spanend
#spandel
#code{{
#spanend
 final Cursor cc = label.getCursor();
 final Cursor hc = new Cursor(Cursor.HAND_CURSOR);
 final JViewport vport = scroll.getViewport();
 vport.addMouseMotionListener(new MouseMotionAdapter() {
   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;
   }
 });
 vport.addMouseListener(new MouseAdapter() {
   public void mousePressed(MouseEvent e) {
     startX = e.getX();
     startY = e.getY();
     label.setCursor(hc);
   }
   public void mouseReleased(MouseEvent e) {
     label.setCursor(cc);
     label.repaint();
   }
 });
  @Override public void mousePressed(MouseEvent e) {
    e.getComponent().setCursor(hndCursor);
    pp.setLocation(e.getPoint());
  }
#spanadd

#spanend
  @Override public void mouseReleased(MouseEvent e) {
    e.getComponent().setCursor(defCursor);
  }
#spanadd
}
#spanend
View in GitHub: Java, Kotlin
  • &jnlp;
  • &jar;
  • &zip;

解説

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

解説

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

参考リンク

コメント

#spanend
#spanadd
// // JDK 1.6.0
#spanend
#spanadd
// JScrollPane scroll = new JScrollPane(label);
#spanend
#spanadd
// JViewport vport = scroll.getViewport();
#spanend
#spanadd

#spanend
#spanadd
// JDK 1.7.0 or later
#spanend
#spanadd
JViewport vport = new JViewport() {
#spanend
  private static final boolean WEIGHT_MIXING = false;
  private boolean isAdjusting;
  @Override public void revalidate() {
    if (!WEIGHT_MIXING && isAdjusting) {
      return;
    }
    super.revalidate();
  }
#spanadd

#spanend
  @Override public void setViewPosition(Point p) {
    if (WEIGHT_MIXING) {
      super.setViewPosition(p);
    } else {
      isAdjusting = true;
      super.setViewPosition(p);
      isAdjusting = false;
    }
  }
#spanadd
};
#spanend
#spanadd
vport.add(label);
#spanend
#spanadd
JScrollPane scroll = new JScrollPane();
#spanend
#spanadd
scroll.setViewport(vport);
#spanend
#spanadd

参考リンク

コメント