Swing/HorizontalMouseWheel のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/HorizontalMouseWheel へ行く。
- category: swing folder: HorizontalMouseWheel title: JScrollPaneでMouseWheelによる水平スクロールを行う tags: [JScrollPane, MouseWheelListener] author: aterai pubdate: 2015-03-30T00:02:11+09:00 description: JScrollPaneで水平スクロールを行えるように、その内部のコンポーネントやHorizontalScrollBarにMouseWheelListenerを設定します。 image:
概要
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
に転送するようにしています。HorizontalScrollBar
にもMouseWheelListener
を追加しているので、その上でマウスホイールを回転する場合は、Ctrlキー無しでも水平スクロールが実行されます。