JTreeで親ノードが展開されたときに子ノードの選択状態を変更する
Total: 629, Today: 1, Yesterday: 0
Posted by aterai at 
Last-modified: 
Summary
JTreeで親ノードが展開されたときにその選択状態で子ノードの選択状態も切り替えるTreeWillExpandListenerを作成します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
- 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が未選択状態の場合はなにも実行しない