• category: swing folder: DividerFocus title: JSplitPaneのDividerをマウスクリックで選択状態にする tags: [JSplitPane] author: aterai pubdate: 2020-05-11T17:50:27+09:00 description: JSplitPaneのDividerをマウスでクリックしたとき選択状態になるよう設定します。 image: https://drive.google.com/uc?id=1KMTrAVDblIUSfTjTvu0s_fBYMckaaF9Z

概要

JSplitPaneDividerをマウスでクリックしたとき選択状態になるよう設定します。

サンプルコード

JSplitPane splitPane = new JSplitPane();
Container divider = ((BasicSplitPaneUI) splitPane.getUI()).getDivider();
divider.addMouseListener(new MouseAdapter() {
  @Override public void mousePressed(MouseEvent e) {
    super.mousePressed(e);
    splitPane.requestFocusInWindow();
    // or
    // Action startResize = splitPane.getActionMap().get("startResize");
    // startResize.actionPerformed(new ActionEvent(
    //     splitPane, ActionEvent.ACTION_PERFORMED, "startResize"));
  }
});
View in GitHub: Java, Kotlin

解説

  • Default
    • デフォルトのJSplitPaneではDividerをクリックしてもフォーカス移動は発生しない
    • F8キーを押してstartResizeアクションを実行しないとDividerは選択状態にならず、カーソルキーでのDivider移動は不可
    • JSplitPaneとその子コンポーネントがすべてフォーカス不可の場合、Dividerを選択状態にすることはできない
      • JSplitPane#setFocusable(true)を設定すればTabキーなどでDividerを選択状態にできる
  • Divider.addMouseListener
    • BasicSplitPaneUI#getDivider()で取得したDividerMouseListenerを設定して、クリックされたら親のJSplitPaneにフォーカスを移動することでDividerを選択状態にする
    • ContainerであるDividerrequestFocusInWindow()を実行することは可能だが、これを実行してもDividerは選択状態にならない
      • JSplitPaneとその子コンポーネントがすべてフォーカス不可でもDividerを選択状態にできる

  • メモ: カーソルキーによるDividerの移動量を変更したい
    • BasicSplitPaneUI.KEYBOARD_DIVIDER_MOVE_OFFSETが定義されているがどこからも使用されていない?
    • BasicSplitPaneUI#getKeyboardMoveIncrement()メソッドが存在してマジックナンバーで3が返される
      • これをオーバーライドして移動量を変更したいが、パッケージプライベートなので利用しづらい

参考リンク

コメント