• 追加された行はこの色です。
  • 削除された行はこの色です。
---
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?export=view&id=1ozunqsWtmzdel3isGcmth6R1GRxkSju28Q
image: https://drive.google.com/uc?export=view&id=1ozunqsWtmzdel3isGcmth6R1GRxkSju28Q
---
* 概要 [#summary]
`JTree`でノード階層の深さ(`TreePath`内の要素数)を取得し、それに応じてノード追加の制限を行います。

#download(https://drive.google.com/uc?export=view&id=1ozunqsWtmzdel3isGcmth6R1GRxkSju28Q)
#download(https://drive.google.com/uc?export=view&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");
  self.add(child);
  model.reload(self);
} else {
  JOptionPane.showMessageDialog(tree, "ERROR: Maximum levels of 2 exceeded.");
}
}}

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

- メモ:
-- ルートパスの`TreePath#getPathCount()`は`1`、ルートノードの`DefaultMutableTreeNode#getLevel()`は`0`
-- `TreePath#getPathCount()`、`DefaultMutableTreeNode#getLevel()`の返り値は、ルートノードの可視・不可視には依存しない

//* 参考リンク [#reference]
* コメント [#comment]
#comment
#comment