TITLE:JTreeのノード追加、削除

Posted by aterai at 2011-05-02

JTreeのノード追加、削除

JTreeにノードを追加、削除します。

  • &jnlp;
  • &jar;
  • &zip;
AddNode.png

サンプルコード

class TreePopupMenu extends JPopupMenu {
  private TreePath path;
  public TreePopupMenu() {
    super();
    add(new AbstractAction("add") {
      @Override public void actionPerformed(ActionEvent e) {
        JTree tree = (JTree)getInvoker();
        DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
        DefaultMutableTreeNode parent =
          (DefaultMutableTreeNode)path.getLastPathComponent();
        DefaultMutableTreeNode child  = new DefaultMutableTreeNode("New");
        //model.insertNodeInto(child, parent, 0);
        parent.add(child);
        model.nodeStructureChanged(parent);
        tree.expandPath(path);
      }
    });
    add(new AbstractAction("remove") {
      @Override public void actionPerformed(ActionEvent e) {
        JTree tree = (JTree)getInvoker();
        DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
        DefaultMutableTreeNode node =
          (DefaultMutableTreeNode)path.getLastPathComponent();
        //if(path.getParentPath()!=null) {
        if(!node.isRoot()) {
          model.removeNodeFromParent(node);
        }
      }
    });
  }
  @Override public void show(Component c, int x, int y) {
    JTree tree = (JTree)c;
    TreePath[] tsp = tree.getSelectionPaths();
    if(tsp!=null) {
      path = tree.getPathForLocation(x, y);
      if(path!=null && Arrays.asList(tsp).contains(path)) {
        super.show(c, x, y);
      }
    }
  }
}

解説

上記のサンプルでは、JPopupMenuを使って、選択したノードに子ノードの追加、削除、名前変更ができます。

  • 追加
    • DefaultMutableTreeNode#add(DefaultMutableTreeNode)メソッドを使ってノードを追加し、DefaultTreeModel#nodeStructureChanged(DefaultMutableTreeNode)で更新を通知
    • DefaultTreeModel#.insertNodeInto(...)メソッドを使用する方法もある
  • 削除
    • ルートノードでない場合(DefaultMutableTreeNode#isRoot()が偽)、DefaultTreeModel#removeNodeFromParent(DefaultMutableTreeNode)で削除
  • 名前変更

参考リンク

コメント