---
category: swing
folder: MouseWheelTabCycling
title: JTabbedPaneのタブ選択をマウスホイールで変更する
tags: [JTabbedPane, MouseWheelListener, ActionMap]
author: aterai
pubdate: 2020-06-15T02:56:24+09:00
description: JTabbedPaneのタブ選択をマウスホイールの上下回転で変更します。
image: https://drive.google.com/uc?id=1o0WYONVZxnE60UMRtEN7JBE5NOsbpwTI
---
* Summary [#summary]
`JTabbedPane`のタブ選択をマウスホイールの上下回転で変更します。

#download(https://drive.google.com/uc?id=1o0WYONVZxnE60UMRtEN7JBE5NOsbpwTI)

* Source Code Examples [#sourcecode]
#code(link){{
private class TabWheelHandler implements MouseWheelListener {
  @Override public void mouseWheelMoved(MouseWheelEvent e) {
    JTabbedPane src = (JTabbedPane) e.getComponent();
    if (!getTabAreaBounds(src).contains(e.getPoint())) {
      return;
    }
    boolean dir = (e.isControlDown() ? -1 : 1) * e.getPreciseWheelRotation() > 0;
    int id = ActionEvent.ACTION_PERFORMED;
    String cmd;
    if (check.isSelected()) {
      cmd = dir ? "scrollTabsForwardAction" : "scrollTabsBackwardAction";
    } else {
      cmd = dir ? "navigateNext" : "navigatePrevious";
    }
    ActionEvent event = new ActionEvent(
        src, id, cmd, e.getWhen(), e.getModifiersEx());
    src.getActionMap().get(cmd).actionPerformed(event);
  }
}
}}

* Explanation [#explanation]
上記のサンプルでは、`JTabbedPane`に上方向のホイール回転で前のタブ、下方向のホイール回転で次のタブを選択する`MouseWheelListener`を追加しています。

- マウスカーソルがタブエリア上にある場合のみホイール回転でタブ選択を変更
-- カーソルキーによるタブ選択移動とは異なり、タブにフォーカスがない場合でもマウスカーソルがタブエリア上に存在すればタブ選択を変更可能
-- 参考: [[JTabbedPane間でタブのドラッグ&ドロップ移動>Swing/DnDExportTabbedPane]]
- KBD{Ctrl}キーを押しながらホイール回転で逆方向にタブ選択を移動する
- `JTabbedPane`の`ActionMap`から`navigateNext`、`navigatePrevious`アクションを取得してホイール回転の方向に応じて`actionPerformed`メソッドを実行
-- このため末尾タブから先頭、または先頭タブから末尾へのタブ選択移動が可能
-- `JTabbedPane#setEnabledAt(index, false)`で選択不可にしたタブは自動的にスキップする
--- `JTabbedPane#setSelectedIndex(index)`を使用すると選択不可にしたタブも選択されてしまう
-- `navigateNext|navigatePrevious`アクションはカーソルキーに割り当てられている`navigateRight|navigateLeft|navigateUp|navigateDown`とは異なりタブ配置位置に依存せずにタブ選択の変更が可能
--- たとえば`SCROLL_TAB_LAYOUT`レイアウトでタブ配置位置が`TOP`の`JTabbedPane`の場合、左右カーソルキーでタブ選択は変更可能だが上下キーは無反応
--- `WRAP_TAB_LAYOUT`レイアウトでタブ配置位置が`TOP`の`JTabbedPane`の場合、左右カーソルキーでタブ選択は同一ラン内でタブ選択が変更可能(先頭から末尾へのループなどは不可)、上下キーは上下のタブランへの移動になる
- `scroll tabs`をチェックすると`scrollTabsForwardAction|scrollTabsBackwardAction`アクションを使用してタブ選択は実行せずにタブエリアのスクロールのみホイール回転で実行する

* Reference [#reference]
- [[JTabbedPane間でタブのドラッグ&ドロップ移動>Swing/DnDExportTabbedPane]]
- [[JTabbedPaneのTabAreaをスクロール>Swing/ScrollTabToVisible]]

* コメント [#comment]
* Comment [#comment]
#comment
#comment