概要

JTreeの親ノードが選択されている場合、キー入力でその展開・折り畳み状態を切り替えます。

サンプルコード

InputMap im = tree.getInputMap(JComponent.WHEN_FOCUSED);
int modifiers1 = InputEvent.CTRL_DOWN_MASK;
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_T, modifiers1), "toggle");
int modifiers2 = InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK;
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_T, modifiers2), "toggle2");
ActionMap am = tree.getActionMap();
am.put("toggle2", new AbstractAction() {
  @Override public void actionPerformed(ActionEvent e) {
    int row = tree.getLeadSelectionRow();
    TreePath path = tree.getPathForRow(row);
    if (!tree.isExpanded(path)) {
      tree.expandPath(path);
    } else {
      tree.collapsePath(path);
    }
  }
});
View in GitHub: Java, Kotlin

解説

  • BasicTreeUI.TreeToggleAction
    • BasicTreeUIにはTreeToggleActionが実装されてJTreeActionMapに追加されているため、これを呼び出すKeyStrokeJTreeInputMapに追加
    • このサンプルではCtrl+TTreeToggleActionを実行
    • 展開+、折り畳み-アイコンのシングルクリックと同等
    • TreeNodeの左マウスボタンでのダブルクリック(JTree#getToggleClickCount()がデフォルトの2の場合)とは異なり、TreeToggleActionによるノードトグルはその子ノード以外の選択状態は維持される
  • JTree#isExpanded(...), JTree#collapsePath(...)
    • JTree#isExpanded(TreePath)で展開・折り畳み状態をチェックし、JTree#isExpanded(...)で展開、JTree#collapsePath(...)で折り畳みを実行するAbstractActionJTreeActionMapに追加
    • このサンプルではShift+Ctrl+TでこのActionを実行
    • TreeToggleActionとは異なり、行表示スクロールなどの処理を省略している

参考リンク

コメント