Swing/AddNode のバックアップの現在との差分(No.10)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/AddNode へ行く。
- 1 (2011-05-06 (金) 18:46:23)
- 2 (2012-09-10 (月) 11:15:43)
- 3 (2012-12-22 (土) 16:34:03)
- 4 (2012-12-26 (水) 06:03:24)
- 5 (2014-01-30 (木) 20:38:15)
- 6 (2014-09-17 (水) 02:20:45)
- 7 (2014-10-11 (土) 16:59:03)
- 8 (2014-11-12 (水) 02:05:53)
- 9 (2015-08-11 (火) 01:49:47)
- 10 (2016-06-23 (木) 12:31:28)
- 11 (2016-07-04 (月) 01:01:19)
- 12 (2017-09-27 (水) 18:59:56)
- 13 (2019-04-02 (火) 17:28:15)
- 14 (2021-01-08 (金) 13:25:23)
- 15 (2023-07-07 (金) 13:55:13)
- 16 (2024-02-25 (日) 20:51:31)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: AddNode title: JTreeのノード追加、削除 tags: [JTree, JPopupMenu, TreeNode, TreeModel] author: aterai pubdate: 2011-05-02T16:45:24+09:00 description: JTreeのノードを選択してJPopupMenuを開き、そのノードの削除や名前変更、子ノードの追加を行います。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/Tb5bkDzXJHI/AAAAAAAAA6c/qxz0Vzwy4Ts/s800/AddNode.png --- * 概要 [#y57e98ab] * 概要 [#summary] `JTree`のノードを選択して`JPopupMenu`を開き、そのノードの削除や名前変更、子ノードの追加を行います。 #download(https://lh6.googleusercontent.com/_9Z4BYR88imo/Tb5bkDzXJHI/AAAAAAAAA6c/qxz0Vzwy4Ts/s800/AddNode.png) * サンプルコード [#l888db92] * サンプルコード [#sourcecode] #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, parent.getChildCount()); //parent.add(child); //model.reload(); //= model.nodeStructureChanged(parent); // parent.add(child); // model.reload(); // = 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 (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(); path = tree.getPathForLocation(x, y); if (path != null && Arrays.asList(tsp).contains(path)) { super.show(c, x, y); } } } }} * 解説 [#f470d783] 上記のサンプルでは、`JPopupMenu`を使って、選択したノードに子ノードの追加、削除、名前変更ができます。 * 解説 [#explanation] 上記のサンプルでは、`JPopupMenu`を使用して選択したノードに対して子ノードの追加、削除、名前変更ができます。 - 追加 -- `DefaultTreeModel#insertNodeInto(...)`メソッドを使用して、ノードを追加 -- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/tree/DefaultTreeModel.html#insertNodeInto-javax.swing.tree.MutableTreeNode-javax.swing.tree.MutableTreeNode-int- DefaultTreeModel#insertNodeInto(...)]メソッドを使用して、ノードを追加 - 追加とリロード -- `DefaultMutableTreeNode#add(DefaultMutableTreeNode)`メソッドを使ってノードを追加し、`DefaultTreeModel#reload(...)`、または`DefaultTreeModel#nodeStructureChanged(DefaultMutableTreeNode)`で更新を通知 -- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/tree/DefaultMutableTreeNode.html#add-javax.swing.tree.MutableTreeNode- DefaultMutableTreeNode#add(MutableTreeNode)]メソッドを使ってノードを追加し、[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/tree/DefaultTreeModel.html#reload-javax.swing.tree.TreeNode- DefaultTreeModel#reload(...)]、または[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/tree/DefaultTreeModel.html#nodeStructureChanged-javax.swing.tree.TreeNode- DefaultTreeModel#nodeStructureChanged(TreeNode)]メソッドで更新を通知 --- 兄弟ノードの展開状態などがリセットされてしまう - 削除 -- ルートノードでない場合(`DefaultMutableTreeNode#isRoot()`が`false`)、`DefaultTreeModel#removeNodeFromParent(DefaultMutableTreeNode)`で削除 -- ルートノード以外の場合(`DefaultMutableTreeNode#isRoot()`が`false`)[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/tree/DefaultTreeModel.html#removeNodeFromParent-javax.swing.tree.MutableTreeNode- DefaultTreeModel#removeNodeFromParent(MutableTreeNode)]メソッドで削除 - 名前変更 -- [[JTreeのノード編集をPopupからのみに制限する>Swing/StartEditingPopupMenu]]と同じ -- [[JTreeのノード編集をJPopupMenuからのみに制限する>Swing/StartEditingPopupMenu]]と同じ #code{{ model.valueForPathChanged(path, str); //もしくは、 //leaf.setUserObject(str); //model.nodeChanged(leaf); // もしくは、 // leaf.setUserObject(str); // model.nodeChanged(leaf); }} * 参考リンク [#gb30e7d7] * 参考リンク [#reference] - [[JTreeのノード上でJPopupMenuを表示 >Swing/TreeNodePopupMenu]] - [[JTreeのノード編集をPopupからのみに制限する>Swing/StartEditingPopupMenu]] - [[JTreeのノード編集をJPopupMenuからのみに制限する>Swing/StartEditingPopupMenu]] - [[JTreeの選択されたノードの前後に新規ノードを挿入する>Swing/InsertSiblingNode]] * コメント [#ad4d46ba] * コメント [#comment] #comment - ソースなどのリンク切れを修正。 -- &user(aterai); &new{2011-05-06 (金) 18:46:23}; #comment