Swing/AddNode のバックアップの現在との差分(No.1)
TITLE:JTreeのノード追加、削除
Posted by aterai at 2011-05-02
JTreeのノード追加、削除
JTreeにノードを追加、削除します。- 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:
概要
JTree
のノードを選択してJPopupMenu
を開き、そのノードの削除や名前変更、子ノードの追加を行います。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
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();
JTree tree = (JTree) getInvoker();
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
DefaultMutableTreeNode parent =
(DefaultMutableTreeNode)path.getLastPathComponent();
(DefaultMutableTreeNode) path.getLastPathComponent();
DefaultMutableTreeNode child = new DefaultMutableTreeNode("New");
//model.insertNodeInto(child, parent, 0);
parent.add(child);
model.nodeStructureChanged(parent);
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();
JTree tree = (JTree) getInvoker();
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
DefaultMutableTreeNode node =
(DefaultMutableTreeNode)path.getLastPathComponent();
//if(path.getParentPath()!=null) {
if(!node.isRoot()) {
(DefaultMutableTreeNode) path.getLastPathComponent();
// if (path.getParentPath() != null) {
if (!node.isRoot()) {
model.removeNodeFromParent(node);
}
}
});
}
#spanadd
#spanend
@Override public void show(Component c, int x, int y) {
JTree tree = (JTree)c;
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);
}
path = tree.getPathForLocation(x, y);
if (path != null && Arrays.asList(tsp).contains(path)) {
super.show(c, x, y);
}
}
}
解説
上記のサンプルでは、JPopupMenuを使って、選択したノードに子ノードの追加、削除、名前変更ができます。解説
上記のサンプルでは、JPopupMenu
を使用して選択したノードに対して子ノードの追加、削除、名前変更ができます。
- 追加
- DefaultMutableTreeNode#add(DefaultMutableTreeNode)メソッドを使ってノードを追加し、DefaultTreeModel#nodeStructureChanged(DefaultMutableTreeNode)で更新を通知
- DefaultTreeModel#.insertNodeInto(...)メソッドを使用する方法もある
- DefaultTreeModel#insertNodeInto(...)メソッドを使用して、ノードを追加
- 追加とリロード
- DefaultMutableTreeNode#add(MutableTreeNode)メソッドを使ってノードを追加し、DefaultTreeModel#reload(...)、またはDefaultTreeModel#nodeStructureChanged(TreeNode)メソッドで更新を通知
- 兄弟ノードの展開状態などがリセットされてしまう
- DefaultMutableTreeNode#add(MutableTreeNode)メソッドを使ってノードを追加し、DefaultTreeModel#reload(...)、またはDefaultTreeModel#nodeStructureChanged(TreeNode)メソッドで更新を通知
- 削除
- ルートノードでない場合(DefaultMutableTreeNode#isRoot()が偽)、DefaultTreeModel#removeNodeFromParent(DefaultMutableTreeNode)で削除
- 名前変更
- JTreeのノード編集をPopupからのみに制限すると同じ
- ルートノード以外の場合(
DefaultMutableTreeNode#isRoot()
がfalse
)DefaultTreeModel#removeNodeFromParent(MutableTreeNode)メソッドで削除
- 名前変更
- JTreeのノード編集をJPopupMenuからのみに制限すると同じ
model.valueForPathChanged(path, str); #spandel //もしくは、 #spanend #spandel //leaf.setUserObject(str); #spanend #spandel //model.nodeChanged(leaf); #spanend #spanadd // もしくは、 #spanend #spanadd // leaf.setUserObject(str); #spanend #spanadd // model.nodeChanged(leaf); #spanend
- JTreeのノード編集をJPopupMenuからのみに制限すると同じ
参考リンク
参考リンク
- JTreeのノード上でJPopupMenuを表示
- JTreeのノード編集をPopupからのみに制限する
- JTreeのノード編集をJPopupMenuからのみに制限する
- JTreeの選択されたノードの前後に新規ノードを挿入する