概要

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 in GitHub: Java, Kotlin

解説

  • JScrollPaneのビューポートに追加したJLabelMouseWheelListenerを設定
    • Ctrlキーを押しながらマウスホイールを回転した場合は、そのイベントをHorizontalScrollBarに転送
  • HorizontalScrollBarにもMouseWheelListenerを追加
    • Ctrlキー無しのマウスホイール回転で水平スクロールが実行可能

参考リンク

コメント