---
category: swing
folder: TreeNodeMaxLevel
title: JTreeでノード階層の深さを取得する
tags: [JTree, TreePath, DefaultMutableTreeNode]
author: aterai
pubdate: 2016-09-12T01:36:56+09:00
description: JTreeでノード階層の深さ(TreePath内の要素数)を取得し、それに応じてノード追加の制限を行います。
image: https://drive.google.com/uc?id=1ozunqsWtmzdel3isGcmth6R1GRxkSju28Q
---
* 概要 [#summary]
`JTree`でノード階層の深さ(`TreePath`内の要素数)を取得し、それに応じてノード追加の制限を行います。

#download(https://drive.google.com/uc?id=1ozunqsWtmzdel3isGcmth6R1GRxkSju28Q)

* サンプルコード [#sourcecode]
#code(link){{
private void updateLabel(TreePath path) {
  countLabel.setText("PathCount: " + path.getPathCount());
  Object o = path.getLastPathComponent();
  if (o instanceof DefaultMutableTreeNode) {
    DefaultMutableTreeNode n = (DefaultMutableTreeNode) o;
    levelLabel.setText("Level: " + n.getLevel());
  }
}
// ...
JTree tree = (JTree) getInvoker();
TreePath path = tree.getSelectionPath();
if (path.getPathCount() < 3) {
  DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
  DefaultMutableTreeNode self  = (DefaultMutableTreeNode) path.getLastPathComponent();
  DefaultMutableTreeNode child = new DefaultMutableTreeNode("New child node");
  DefaultTreeModel model =
      (DefaultTreeModel) tree.getModel();
  DefaultMutableTreeNode self =
      (DefaultMutableTreeNode) path.getLastPathComponent();
  DefaultMutableTreeNode child =
      new DefaultMutableTreeNode("New child node");
  self.add(child);
  model.reload(self);
} else {
  JOptionPane.showMessageDialog(tree, "ERROR: Maximum levels of 2 exceeded.");
  JOptionPane.showMessageDialog(
      tree, "ERROR: Maximum levels of 2 exceeded.");
}
}}

* 解説 [#explanation]
上記のサンプルでは、`TreePath#getPathCount()`、または`DefaultMutableTreeNode#getLevel()`メソッドを使用してノード階層の深さを取得し、指定したレベルを超えるノードを作成できないように制限しています。

- ルートパスの`TreePath#getPathCount()`は`1`、ルートノードの`DefaultMutableTreeNode#getLevel()`は`0`
- `TreePath#getPathCount()`と`DefaultMutableTreeNode#getLevel()`の戻り値は[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JTree.html#setRootVisible-boolean- JTree#setRootVisible(boolean)]で設定したルートノードの可視・不可視には依存しない

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/tree/TreePath.html#getPathCount-- TreePath#getPathCount() (Java Platform SE 8)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/tree/DefaultMutableTreeNode.html#getLevel-- DefaultMutableTreeNode#getLevel() (Java Platform SE 8)]
- [[JTreeの各ノードタイトルに章番号を自動追加して表示する>Swing/AutoChapterNumberingTreeNode]]

* コメント [#comment]
#comment
#comment