2013-12-04 2 views
2

Я делаю JTree, и у меня есть кнопка, которая удаляет узел из дерева. Каждый раз, когда я удаляю узел с помощью кнопки, дерево автоматически обрушивается. Я читал, что это потому, что я использую .reload(). Я также прочитал некоторые ответы SO, которые предложили использовать .nodeChanged(node), который я пробовал, но когда я его использую, я считаю, что модель обновляется, но дерево не перезагружается соответственно в графическом интерфейсе. Как я могу заставить дерево не рухнуть?Как остановить JTree от свертывания после удаления узла из дерева

Вот простой SSCCE с по умолчанию JTree и кнопка удаления узла

import java.awt.BorderLayout; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.tree.*; 

public class StopTreeCollapse extends JApplet { 

    JTree tree = new JTree(); 
    JButton jbtRemove = new JButton("Remove Node"); 

    public StopTreeCollapse(){ 

     add(new JScrollPane(tree), BorderLayout.CENTER); 
     add(jbtRemove, BorderLayout.SOUTH); 

     jbtRemove.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       TreePath[] paths = tree.getSelectionPaths(); 

       if (paths == null) { 
        JOptionPane.showMessageDialog(null, 
          "No node in the tree is selected"); 
        return; 
       } 
       DefaultMutableTreeNode node = null; 
       for (TreePath path : paths) { 
        node = (DefaultMutableTreeNode) (path.getLastPathComponent()); 
        if (node.isRoot()) { 
         JOptionPane.showMessageDialog(null, "Cannot remove the root"); 
        } else { 
         node.removeFromParent(); 
        } 
       } 
       ((DefaultTreeModel) tree.getModel()).reload(); 
      } 
     }); 
    } 
} 

ответ

4

reload() по существу говорит, что «целое дерево может измениться, забыть все, что вы раньше знали об этом и начать заново».

Вместо использования node.removeFromParent(), а затем загрузить все дерево, попробуйте

((DefaultTreeModel) tree.getModel()).removeNodeFromParent(node); 

Это будет срабатывать более конкретное событие модификации, говоря слушателям, что этот конкретный узел был удален, но остальная часть дерева остается неизменным, так вам больше не нужен звонок reload().

+0

Genius ......... –

+0

'((DefaultTreeModel) tree.getModel()). RemoveNodeFromParent (node);' все равно сворачивает все дерево для меня, и я никогда не вызывал 'reload() 'просто' updateUI() ' – Troyseph

Смежные вопросы