Swing/AddNode のバックアップ(No.9)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
- title: JTreeのノード追加、削除 tags: [JTree, JPopupMenu, TreeNode, TreeModel] author: aterai pubdate: 2011-05-02T16:45:24+09:00 description: JTreeのノードを選択してJPopupMenuを開き、そのノードの削除や名前変更、子ノードの追加を行います。
概要
JTree
のノードを選択してJPopupMenu
を開き、そのノードの削除や名前変更、子ノードの追加を行います。
Screenshot
Advertisement
サンプルコード
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);
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);
}
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JPopupMenu
を使って、選択したノードに子ノードの追加、削除、名前変更ができます。
- 追加
DefaultTreeModel#insertNodeInto(...)
メソッドを使用して、ノードを追加
- 追加とリロード
DefaultMutableTreeNode#add(DefaultMutableTreeNode)
メソッドを使ってノードを追加し、DefaultTreeModel#reload(...)
、またはDefaultTreeModel#nodeStructureChanged(DefaultMutableTreeNode)
で更新を通知- 兄弟ノードの展開状態などがリセットされてしまう
- 削除
- ルートノードでない場合(
DefaultMutableTreeNode#isRoot()
がfalse
)、DefaultTreeModel#removeNodeFromParent(DefaultMutableTreeNode)
で削除
- ルートノードでない場合(
- 名前変更
model.valueForPathChanged(path, str);
//もしくは、
//leaf.setUserObject(str);
//model.nodeChanged(leaf);