概要
JTree
の親ノードが選択されている場合、キー入力でその展開・折り畳み状態を切り替えます。
Screenshot
Advertisement
サンプルコード
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
が実装されてJTree
のActionMap
に追加されているため、これを呼び出すKeyStroke
をJTree
のInputMap
に追加- このサンプルではCtrl+Tで
TreeToggleAction
を実行 - 展開
+
、折り畳み-
アイコンのシングルクリックと同等 TreeNode
の左マウスボタンでのダブルクリック(JTree#getToggleClickCount()
がデフォルトの2
の場合)とは異なり、TreeToggleAction
によるノードトグルはその子ノード以外の選択状態は維持される
JTree#isExpanded(...), JTree#collapsePath(...)
JTree#isExpanded(TreePath)
で展開・折り畳み状態をチェックし、JTree#isExpanded(...)
で展開、JTree#collapsePath(...)
で折り畳みを実行するAbstractAction
をJTree
のActionMap
に追加- このサンプルではShift+Ctrl+Tでこの
Action
を実行 TreeToggleAction
とは異なり、行表示スクロールなどの処理を省略している
参考リンク
- JTreeで特定のノードをマウスクリックした場合のみ展開不可に設定する
- [JDK-8317771] [macos14] Expand/collapse a JTree using keyboard freezes the application in macOS 14 Sonoma - Java Bug System