概要

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 in GitHub: Java, Kotlin

解説

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

  • ルートパスのTreePath#getPathCount()1、ルートノードのDefaultMutableTreeNode#getLevel()0
  • TreePath#getPathCount()DefaultMutableTreeNode#getLevel()の戻り値はJTree#setRootVisible(boolean)で設定したルートノードの可視・不可視には依存しない

参考リンク

コメント