Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Удаление node из JTree


Автор: ShkVal 16.11.2004, 17:02
Народ подскажите как удалить элемент дерева (DefaultMutableTreeNode) из дерева. Нашёл метод removeFromParent() у DefaultMutableTreeNode, но он почему-то не работает. Как удалить?
Или попробовать найти родителя и из него уже удалять? Или можно без родителя?

Автор: Domestic Cat 16.11.2004, 17:04
Код

                   TreePath path = tree.getSelectionPath();
                   if (path == null) return;
                   Node node = (Node)path.getLastPathComponent();
                   final TreeNode parent = node.getParent();
                   node.removeFromParent();                  
                   ((DefaultTreeModel)tree.getModel()).nodeStructureChanged(parent);



ПС. я туt код менял, т.к. скопировал со своего класса

Автор: ShkVal 16.11.2004, 18:40
Цитата(Domestic @ 16.11.2004, 17:04)
Код

                   TreePath path = tree.getSelectionPath();
                   if (path == null) return;
                   Node node = (Node)path.getLastPathComponent();
                   final TreeNode parent = node.getParent();
                   node.removeFromParent();                  
                   ((DefaultTreeModel)tree.getModel()).nodeStructureChanged(parent);



ПС. я туt код менял, т.к. скопировал со своего класса

что-то у меня не заработало. Вот мой код
Код

public void showContextMenu(JTree tree,MutableTreeNode treeNode,int x,int y) {
       JPopupMenu menu=new JPopupMenu();
       lastTreeNode=(DefaultMutableTreeNode)treeNode;
       lastTree=(XmlTree)tree;
       menu.add(new JMenuItem(new AbstractAction("Delete module") {
               public void actionPerformed(ActionEvent event) {
                   lastTreeNode.removeFromParent();
                   final TreeNode parent = lastTreeNode.getParent();
                   ((DefaultTreeModel)lastTree.getModel()).nodeStructureChanged(parent);
               }
           }));
       menu.show(appData.getFrame().getLeftPanel(), x, y);
   }


Т. е. тут через контекстное меню хочу удалить.
Само удаление происходит тут
Код

public void actionPerformed(ActionEvent event) {
                   lastTreeNode.removeFromParent();
                   final TreeNode parent = lastTreeNode.getParent();
                   ((DefaultTreeModel)lastTree.getModel()).nodeStructureChanged(parent);
               }
           }));



В общем почему-то не работает подскажите в чём ошибка.

Автор: ShkVal 16.11.2004, 19:01
Цитата(ShkVal @ 16.11.2004, 18:40)
Цитата(Domestic @ 16.11.2004, 17:04)
Код

                   TreePath path = tree.getSelectionPath();
                   if (path == null) return;
                   Node node = (Node)path.getLastPathComponent();
                   final TreeNode parent = node.getParent();
                   node.removeFromParent();                  
                   ((DefaultTreeModel)tree.getModel()).nodeStructureChanged(parent);



ПС. я туt код менял, т.к. скопировал со своего класса

что-то у меня не заработало. Вот мой код
Код

public void showContextMenu(JTree tree,MutableTreeNode treeNode,int x,int y) {
       JPopupMenu menu=new JPopupMenu();
       lastTreeNode=(DefaultMutableTreeNode)treeNode;
       lastTree=(XmlTree)tree;
       menu.add(new JMenuItem(new AbstractAction("Delete module") {
               public void actionPerformed(ActionEvent event) {
                   lastTreeNode.removeFromParent();
                   final TreeNode parent = lastTreeNode.getParent();
                   ((DefaultTreeModel)lastTree.getModel()).nodeStructureChanged(parent);
               }
           }));
       menu.show(appData.getFrame().getLeftPanel(), x, y);
   }


Т. е. тут через контекстное меню хочу удалить.
Само удаление происходит тут
Код

public void actionPerformed(ActionEvent event) {
                   lastTreeNode.removeFromParent();
                   final TreeNode parent = lastTreeNode.getParent();
                   ((DefaultTreeModel)lastTree.getModel()).nodeStructureChanged(parent);
               }
           }));



В общем почему-то не работает подскажите в чём ошибка.

Спасибо FAQ.
Получилось таким образом
Код

public void actionPerformed(ActionEvent event) {
 //                  lastTreeNode.removeFromParent();
 //                  final TreeNode parent = lastTreeNode.getParent();
 //                  ((DefaultTreeModel)lastTree.getModel()).nodeStructureChanged(parent);
                   DefaultTreeModel model = (DefaultTreeModel)lastTree.getModel();
                   model.removeNodeFromParent(lastTreeNode);
               }

Автор: Domestic Cat 16.11.2004, 19:11
Нужно было писать нe

Код

lastTreeNode.removeFromParent();
final TreeNode parent = lastTreeNode.getParent();
((DefaultTreeModel)lastTree.getModel()).nodeStructureChanged(parent);


а

Код

final TreeNode parent = lastTreeNode.getParent();
lastTreeNode.removeFromParent();
((DefaultTreeModel)lastTree.getModel()).nodeStructureChanged(parent);


Код взят иz рабочей программы, так что проблем тут быть нe может.

Автор: ShkVal 16.11.2004, 19:39
Цитата(Domestic @ 16.11.2004, 19:11)
Нужно было писать нe

Код

lastTreeNode.removeFromParent();
final TreeNode parent = lastTreeNode.getParent();
((DefaultTreeModel)lastTree.getModel()).nodeStructureChanged(parent);


а

Код

final TreeNode parent = lastTreeNode.getParent();
lastTreeNode.removeFromParent();
((DefaultTreeModel)lastTree.getModel()).nodeStructureChanged(parent);


Код взят иz рабочей программы, так что проблем тут быть нe может.

Вот объясни мне пожалуйста в чём разница. Что поменялось от замены строк местами?

Автор: Domestic Cat 16.11.2004, 19:43
Если ты удаляешь ноду от парента, то после этого парента у нее нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)