2014-10-26 2 views
1

Скажем, я кодирую редактируемую файловую систему дерева и добавляю прослушиватель действий для кнопки «добавить ребенка». То есть, как только я выберу узел в дереве и нажмите кнопку «Добавить ребенка». Должен быть новый узел «Новый», становящийся его ребенком, который был показан на рис.1.insertNodeInto функция работает только при первой вставке (работает для листового узла)

(К сожалению я не имею 10 репутации размещать изображения .. Но, вероятно, вы можете запустить полный код ниже.)

Но дело в том, мой слушатель работает только в первой вставке, что означает, что он только работает для листового узла.

Когда я пытаюсь добавить новый узел в узел «Thing», дерево не изменяется. Хотя этот показатель не изменился, возвращаемое значение возврата функции .childCount() изменилось в зависимости от того, что отображается на консоли.

addChildButton.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent action) 
     { 
      DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) m_tree. 
       getLastSelectedPathComponent(); 
      if (selectedNode == null) 
      { 
       System.out.println("selected null"); 
       return ; 
      } 
      DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New"); 
      System.out.println(selectedNode.getChildCount()); 
      m_model.insertNodeInto(newNode, selectedNode, 
       selectedNode.getChildCount()); 
      // display the new node 
      m_tree.scrollPathToVisible(new TreePath(newNode.getPath())); 
     } 
    }); 

Для тех, кто хочет, чтобы запустить программу, полный код здесь:

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import javax.swing.tree.*; 
public class TreeEditTest 
{ 
    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       JFrame frame = new TreeEditFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

class TreeEditFrame extends JFrame 
{ 
    public TreeEditFrame() 
    { 
     setTitle("TreeEditTest"); 
     setSize(M_DEFAULT_WIDTH, M_DEFAULT_HEIGHT); 

     // construct tree 
     TreeNode root = makeSampleTree(); 
     m_model = new DefaultTreeModel(root); 
     m_tree = new JTree(root); 
     m_tree.setEditable(true); 
     // add scroll pane with tree 
     JScrollPane scrollPane = new JScrollPane(m_tree); 
     add(scrollPane, BorderLayout.CENTER); 

     // make buttons 
     makeButtons(); 
    } 

    private TreeNode makeSampleTree() 
    { 
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Thing"); 
     DefaultMutableTreeNode pizza = new DefaultMutableTreeNode("Pizza"); 
     DefaultMutableTreeNode pizzaBase = new DefaultMutableTreeNode("PizzaBase"); 
     DefaultMutableTreeNode pizzaTopping = new DefaultMutableTreeNode("PizzaTopping"); 
     root.add(pizza); 
     root.add(pizzaBase); 
     root.add(pizzaTopping); 
     DefaultMutableTreeNode deepPanBase = new DefaultMutableTreeNode("DeepPanBase"); 
     DefaultMutableTreeNode thinAndCrispyBase = new DefaultMutableTreeNode("ThinAndCrispyBase"); 
     pizzaBase.add(deepPanBase); 
     pizzaBase.add(thinAndCrispyBase); 

     return root;   
    } 

    private void makeButtons() 
    { 
     JPanel panel = new JPanel(); 
     JButton addChildButton = new JButton("Add Child");  
     JButton addSiblingButton = new JButton("Add Sibling"); 
     JButton deleteButton = new JButton("Delete"); 
     addChildButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent action) 
      { 
       DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) m_tree. 
        getLastSelectedPathComponent(); 
       if (selectedNode == null) 
       { 
        System.out.println("selected null"); 
        return ; 
       } 
       DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New"); 
       System.out.println(selectedNode.getChildCount()); 
       m_model.insertNodeInto(newNode, selectedNode, 
        selectedNode.getChildCount()); 

//    display the new node 
       m_tree.scrollPathToVisible(new TreePath(newNode.getPath())); 
      } 
     }); 
     addSiblingButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent action) 
      { 
       DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) m_tree. 
        getLastSelectedPathComponent(); 
       if (selectedNode == null) 
       { 
        System.out.println("selected null"); 
        return ; 
       } 
       DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode. 
        getParent(); 
       if (parent == null) 
       { 
        System.out.println("parent null");     
        return ; 
       } 
       DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New"); 
       int selectedIndex = parent.getIndex(selectedNode); 
//    System.out.println(parent.getChildCount());    
//    m_model.insertNodeInto(newNode, parent, parent.getChildCount()); 
       System.out.println(selectedIndex+1); 
       m_model.insertNodeInto(newNode, parent, selectedIndex+1); 

       // now display the new node 
       TreeNode[] nodes = m_model.getPathToRoot(newNode); 
       TreePath path = new TreePath(nodes); 
       m_tree.scrollPathToVisible(path); 
      } 
     }); 
     deleteButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent action) 
      { 
       DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) m_tree. 
        getLastSelectedPathComponent(); 
       if (selectedNode == null) 
       { 
        System.out.println("selected null"); 
        return ; 
       } 
       DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode. 
        getParent(); 
       if (parent == null) 
       { 
        System.out.println("Cannot delete the \"Thing\" node"); 
        return ; 
       } 
       m_model.removeNodeFromParent(selectedNode); 
      } 
     }); 
     panel.add(addChildButton); 
     panel.add(addSiblingButton); 
     panel.add(deleteButton); 

     add(panel, BorderLayout.NORTH); 
    } 

    private DefaultTreeModel m_model; 
    private JTree m_tree; 
    private static final int M_DEFAULT_WIDTH = 400; 
    private static final int M_DEFAULT_HEIGHT = 200; 
} 

ответ

0

Это просто потому, что JTree не использует модель. Он использует другую модель, которую он создает из корневого дерева, которое вы передали в качестве аргумента в конструктор дерева. Заменить

m_tree = new JTree(root); 

по

m_tree = new JTree(m_model); 
+0

Большое спасибо! Мне все еще интересно, почему этот «add child» прослушиватель работает для листового узла;) –