JScrollPaneでMouseWheelによる水平スクロールを行う
Total: 5283
, Today: 7
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JScrollPane
で水平スクロールを行えるように、その内部のコンポーネントやHorizontalScrollBar
にMouseWheelListener
を設定します。
Screenshot
Advertisement
サンプルコード
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
のビューポートに追加したJLabel
にMouseWheelListener
を設定- Ctrlキーを押しながらマウスホイールを回転した場合は、そのイベントを
HorizontalScrollBar
に転送
- Ctrlキーを押しながらマウスホイールを回転した場合は、そのイベントを
HorizontalScrollBar
にもMouseWheelListener
を追加- Ctrlキー無しのマウスホイール回転で水平スクロールが実行可能