2011-11-30 1 views
1

구독하는 모델의 변경 내용에 응답하기 위해 TreeModelChanged 수신기를 가져올 수없는 이유를 이해해야합니다.TreeModelListener가 구독하는 TreeModel의 변경 내용에 응답하지 않습니다.

작은 예제에서 문제를 재현 해 냈습니다.

새 노드가 트리에 추가 될 때마다 SysOut 메시지가 콘솔에 인쇄되지 않습니다.

나는 트리를 다시 그리기 위해 SysOut 메시지를 몇 가지 명령으로 대체하려고합니다. 지금은 청취자가 해고되지 않았다는 것을 증명하기 위해 SysOut 메시지를 사용하고 있습니다.

나는 근본적인 것이 누락 되었습니까?

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.event.TreeModelEvent; 
import javax.swing.event.TreeModelListener; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 


public class TreeTest { 

    private JTree t; 
    private DefaultTreeModel m ; 

    public static void main(String[] args) { 
     new TreeTest(); 

    } 

    public TreeTest() { 

     //Draw Frame & Panel - set dimensions 
     JFrame f = new JFrame(); 
     f.setSize(new Dimension(800,600)); 
     JPanel p = new JPanel(); 
     p.setSize(new Dimension(800,600)); 



     //Create a Tree Model. Give it a String at the root. 
     m = new DefaultTreeModel(new DefaultMutableTreeNode("Root")); 

     //Create a tree and add the Model to it 
     t = new JTree(); 
     t.setModel(m); 


     //Try a Tree Model Listener 
     m.addTreeModelListener(new TreeModelListener() { 

      private void doSomething() { 
       //Should fire whenever a node is added to the model 
       System.out.println("Responding to TreeModelListener"); 
      } 
      @Override 
      public void treeStructureChanged(TreeModelEvent e) { 
       doSomething(); 

      } 

      @Override 
      public void treeNodesRemoved(TreeModelEvent e) { 
       doSomething(); 

      } 

      @Override 
      public void treeNodesInserted(TreeModelEvent e) { 
       doSomething(); 

      } 

      @Override 
      public void treeNodesChanged(TreeModelEvent e) { 
       doSomething(); 

      } 
     });  

     //Add listener to a button which adds nodes to the tree when clicked 
     JButton addNode = new JButton("Add node"); 
     addNode.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New Node"); 
       DefaultMutableTreeNode root = (DefaultMutableTreeNode) m.getRoot(); 
       root.add(newNode); 
      } 
     }); 

     JScrollPane s = new JScrollPane(t); 


     p.add(s); 
     p.add(addNode); 

     p.setVisible(true); 
     f.add(p); 
     f.setVisible(true); 
    } 

} 

답변

2

모델이 추가에 대해 알지 못하기 때문에 그것이 발 밑에서 발생합니다. 삽입을 할 DefaultTreeModel을의 방법을 사용

model.insertNodeInto(newNode, root, root.getChildCount()) 

편집

을의 TreeNode 단지 (다소) 바보 같은 데이터 구조입니다. api에서 볼 수 있듯이 Observable이 아니므로 노드에 변경된 사항이 있는지 감지하기 위해 해당 데이터 구조를 사용하는 모델에 대해서는이 없습니다. 변화의 그것을 인식하게하려면 (nodesWereInserted 호출) 수동 모델을 모델

  • 업데이 트 노드의 노드 조작 방법 두 가지

    중 하나 개
    • 사용을하고 통지해야

      첫 번째 방법이 바람직합니다 (속한 곳을 계속 제어하는 ​​방법). 두 번째 방법은 좀 더 복잡한 상황에서 필요할 수 있습니다. (을 절대 사용하지 마십시오. 이렇게하면 SwingX DefaultTreeTableModel에 노출되지 않습니다.

  • +0

    당신의 제안에 감사드립니다. "발 밑에 일어나는"것에 대해 당신이 의미하는 바가 무엇인지 설명해 주시겠습니까? 청취자가 DefaultTreeModel 객체의 상태 변경을 감시한다고 생각했습니다. 나는 위의 코드 예제와 같은 노드를 추가하는 것이 그와 같을 것이라고 생각했을 것입니다. – 8bitjunkie

    +0

    설명 주셔서 감사합니다. – 8bitjunkie