概要

JTreeでノード階層の深さ(TreePath内の要素数)を取得し、それに応じてノード追加の制限を行います。

サンプルコード

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.");
}
view all

解説

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

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

コメント