---
title: JTreeへのノード追加をテスト
tags: [JTree, DefaultTreeModel, DefaultMutableTreeNode]
author: aterai
pubdate: 2014-02-03T12:43:56+09:00
description: JTreeにノード追加をした場合、兄弟ノードの展開状態などがどうなるかをテストします。
---
* 概要 [#f0c6823c]
`JTree`にノード追加をした場合、兄弟ノードの展開状態などがどうなるかをテストします。

#download(https://lh3.googleusercontent.com/-siBaGX1oXx8/Uu8JPWZaA7I/AAAAAAAAB_Y/fzV1VSKYg9I/s800/InsertNodeInto.png)

* サンプルコード [#iabe3118]
#code(link){{
DefaultTreeModel model1 = (DefaultTreeModel)tree1.getModel();
DefaultMutableTreeNode parent1 = (DefaultMutableTreeNode)model1.getRoot();
DefaultMutableTreeNode child1  = new DefaultMutableTreeNode(date);
parent1.add(child1);
model1.reload(parent1);
tree1.scrollPathToVisible(new TreePath(child1.getPath()));

DefaultTreeModel model2 = (DefaultTreeModel)tree2.getModel();
DefaultMutableTreeNode parent2 = (DefaultMutableTreeNode)model2.getRoot();
DefaultMutableTreeNode child2  = new DefaultMutableTreeNode(date);
model2.insertNodeInto(child2, parent2, parent2.getChildCount());
tree2.scrollPathToVisible(new TreePath(child2.getPath()));
}}

* 解説 [#db8ac068]
上記のサンプルでは、`add`ボタンをクリックすると、左右の`JTree`のルートノードが持つ子の末尾に新規ノードを追加しています。

- 左: `p.add(c) & m.reload(p)`
-- `DefaultMutableTreeNode#add(...)`メソッドを使用して、親ノードの末尾に子ノードを追加
--- 追加する子ノードが親ノードを持つ場合、その親子関係は削除される(子ノードが持つ親ノードはひとつのみ)
-- `DefaultTreeModel#reload(...)`、または`DefaultTreeModel#nodeStructureChanged(DefaultMutableTreeNode)`でモデルに更新を通知
--- 兄弟ノードの展開状態などがすべて閉じた状態にリセットされてしまう
- 右: `m.insertNodeInto(c, p, p.size)`
-- `DefaultTreeModel#insertNodeInto(...)`メソッドを使用して、子ノードを親ノードの指定した位置に挿入
--- 内部で、`nodesWereInserted(...)`メソッドが呼び出され、適切なイベントが生成されるので、他のノードの展開状態などは維持される

* 参考リンク [#b66ff81a]
- [[JTreeのノード追加、削除>Swing/AddNode]]
-- ポップアップメニューで任意の位置にノードを追加
- [[JScrollPane内にあるJTableなどで追加した行が可視化されるようにスクロールする>Swing/ScrollRectToVisible]]
-- 追加したノードが表示されるようにスクロール

* コメント [#t8898182]
#comment
#comment