概要

JTabbedPaneのタブ選択をマウスホイールの上下回転で変更します。

スクリーンショット

Swing/MouseWheelTabCycling.png

サンプルコード

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);
  }
}
View in GitHub: Java, Kotlin

解説

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

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

参考リンク

コメント