JTreeで親ノードが展開されたときに子ノードの選択状態を変更する
Total: 193
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
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
配列を生成 JTree#addSelectionPaths(TreePath[])
でJTree
(選択範囲の項目数に制限なし)の選択状態に追加- JTree#setAnchorSelectionPath(TreePath)、JTree#setLeadSelectionPath()で選択のアンカー、リードパスを
JTree#addSelectionPaths(TreePath[])
実行前の状態に復元
- DefaultMutableTreeNode#children()で子の
- 展開予定の
TreePath
が未選択状態の場合はなにも実行しない