概要

JScrollPaneで水平スクロールを行えるように、その内部のコンポーネントやHorizontalScrollBarMouseWheelListenerを設定します。

サンプルコード

label.setBorder(BorderFactory.createTitledBorder("Horizontal scroll: CTRL + Wheel"));
label.addMouseWheelListener(new MouseWheelListener() {
  @Override public void mouseWheelMoved(MouseWheelEvent e) {
    Component c = e.getComponent();
    Container s = SwingUtilities.getAncestorOfClass(JScrollPane.class, c);
    if (Objects.nonNull(s)) {
      JScrollPane sp = (JScrollPane) s;
      JComponent sb = e.isControlDown() ? sp.getHorizontalScrollBar()
                                        : sp.getVerticalScrollBar();
      sb.dispatchEvent(SwingUtilities.convertMouseEvent(c, e, sb));
    }
  }
});

scroll.getVerticalScrollBar().setUnitIncrement(10);

JScrollBar hsb = scroll.getHorizontalScrollBar();
hsb.setUnitIncrement(10);
hsb.addMouseWheelListener(new MouseWheelListener() {
  @Override public void mouseWheelMoved(MouseWheelEvent e) {
    JScrollBar hsb = (JScrollBar) e.getComponent();
    Container p = SwingUtilities.getAncestorOfClass(JScrollPane.class, hsb);
    if (Objects.nonNull(p)) {
      JViewport vport = ((JScrollPane) p).getViewport();
      Point vp = vport.getViewPosition();
      int d = hsb.getUnitIncrement() * e.getWheelRotation();
      vp.translate(d, 0);
      JComponent v = (JComponent) SwingUtilities.getUnwrappedView(vport);
      v.scrollRectToVisible(new Rectangle(vp, vport.getSize()));
    }
  }
});
view all

解説

上記のサンプルでは、JScrollPaneのビューポートに追加したJLabelMouseWheelListenerを設定し、Ctrlキーを押しながらのマウスホイールの場合は、そのイベントをHorizontalScrollBarに転送するようにしています。HorizontalScrollBarにもMouseWheelListenerを追加しているので、その上でマウスホイールを回転する場合は、Ctrlキー無しでも水平スクロールが実行されます。

参考リンク

コメント

  • src.zipなどがダウンロードできない不具合を修正。 -- aterai