Swing/TreeSelectionPaths のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TreeSelectionPaths へ行く。
- 1 (2024-07-01 (月) 04:06:46)
- category: swing folder: TreeSelectionPaths title: JTreeで親ノードが展開されたときに子ノードの選択状態を変更する tags: [JTree, DefaultMutableTreeNode, TreePath, TreeWillExpandListener] author: aterai pubdate: 2024-07-01T04:02:21+09:00 description: JTreeで親ノードが展開されたときにその選択状態で子ノードの選択状態も切り替えるTreeWillExpandListenerを作成します。 image: https://drive.google.com/uc?id=1gzLJzPPF-wTbpmMFjYwnqv5uXcx0iiGB
概要
JTreeで親ノードが展開されたときにその選択状態で子ノードの選択状態も切り替えるTreeWillExpandListenerを作成します。
Screenshot
Advertisement
サンプルコード
JTree tree = new JTree();
tree.addTreeWillExpandListener(new TreeWillExpandListener() {
@Override public void treeWillExpand(TreeExpansionEvent e) {
JTree t = (JTree) e.getSource();
TreePath anchor = t.getAnchorSelectionPath();
TreePath lead = t.getLeadSelectionPath();
TreePath path = e.getPath();
Object o = path.getLastPathComponent();
if (o instanceof DefaultMutableTreeNode && t.isPathSelected(path)) {
DefaultMutableTreeNode n = (DefaultMutableTreeNode) o;
TreePath[] paths = Collections.list((Enumeration<?>) n.children())
.stream()
.filter(DefaultMutableTreeNode.class::isInstance)
.map(DefaultMutableTreeNode.class::cast)
.map(DefaultMutableTreeNode::getPath)
.map(TreePath::new)
.toArray(TreePath[]::new);
t.addSelectionPaths(paths);
t.setAnchorSelectionPath(anchor);
t.setLeadSelectionPath(lead);
}
}
@Override public void treeWillCollapse(TreeExpansionEvent e) {
/* do nothing */
}
});
View in GitHub: Java, Kotlin解説
- TreeExpansionEvent#getPath()で展開予定の
TreePath
を取得 - TreePath#getLastPathComponent()で
TreePath
の最後の要素(展開予定のDefaultMutableTreeNode
)を取得 - 展開予定の
TreePath
が選択状態の場合、以下の手順で子のTreeNode
配列をTreePath
配列に変換してJTree#addSelectionPaths(TreePath[)]で選択状態に追加- DefaultMutableTreeNode#children()で子の
TreeNode
配列を取得 - 取得した
TreeNode
配列がDefaultMutableTreeNode
インスタンスの場合、DefaultMutableTreeNode#getPath()でルートノードから自身までのTreeNode
配列を取得 - new TreePath(TreeNode[)]で子の
TreePath
配列を生成
- DefaultMutableTreeNode#children()で子の
- 展開予定の
TreePath
が未選択状態の場合はなにも実行しない