• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTreeのノード追加、削除
#navi(../)
#tags()
RIGHT:Posted by &author(aterai); at 2011-05-02
*JTreeのノード追加、削除 [#y57e98ab]
JTreeにノードを追加、削除します。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(https://lh6.googleusercontent.com/_9Z4BYR88imo/Tb5bkDzXJHI/AAAAAAAAA6c/qxz0Vzwy4Ts/s800/AddNode.png)

**サンプルコード [#l888db92]
#code(link){{
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);
      }
    }
  }
}
}}

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

- 追加
-- DefaultMutableTreeNode#add(DefaultMutableTreeNode)メソッドを使ってノードを追加し、DefaultTreeModel#nodeStructureChanged(DefaultMutableTreeNode)で更新を通知
-- DefaultTreeModel#.insertNodeInto(...)メソッドを使用する方法もある
-- DefaultTreeModel#insertNodeInto(...)メソッドを使用する方法もある
- 削除
-- ルートノードでない場合(DefaultMutableTreeNode#isRoot()が偽)、DefaultTreeModel#removeNodeFromParent(DefaultMutableTreeNode)で削除
-名前変更
-- [[JTreeのノード編集をPopupからのみに制限する>Swing/StartEditingPopupMenu]]と同じ
#code{{
model.valueForPathChanged(path, str);
//もしくは、
//leaf.setUserObject(str);
//model.nodeChanged(leaf);
}}

**参考リンク [#gb30e7d7]
- [[JTreeのノード上でJPopupMenuを表示 >Swing/TreeNodePopupMenu]]
- [[JTreeのノード編集をPopupからのみに制限する>Swing/StartEditingPopupMenu]]

**コメント [#ad4d46ba]
- example.jar, src.zip のリンク切れを修正。 -- [[aterai]] &new{2011-05-06 (金) 18:46:23};

#comment