2011-04-06 66 views
0

我使用org.dom4j.swing.DocumentTreeModel从分析的DOM文档构造Swing Jtree。当我编辑treeModel的构建文档时,我期望Jtree能够立即通过treeModel.reload()来反映这一点;刷新JtreeModel不起作用,但Jtree相应地更新

问题是,当Jtree先完全折叠,然后通过单击树来展开时,它会显示3个“测试”元素。但是,在这一点上,当我添加更多测试元素时,这种变化不再体现出来!为什么当Jtree swing处于折叠状态时,它能够反映通过向树添加附加“测试”元素所做的更改,而不是Jtree swing展开时的更改。

我完全期待更多的“测试”元素被实时追加,不管JTree是否打开。

org.dom4j.swing.DocumentTreeModel treeModel = null; 

DemoConstructor(){ 
     DOMReader dr = new DOMReader(); 
     org.dom4j.Document dom4jdocument = dr.read(browser.getDocument()); 

     //Create a split pane and display the tree . 
     JScrollPane scrollPane = new JScrollPane(createTree(dom4jdocument)); 
ProgrammaticallyCalledToEditDoc(); 
ProgrammaticallyCalledToEditDoc(); 
ProgrammaticallyCalledToEditDoc(); 
} 

private static void ProgrammaticallyCalledToEditDoc(){ 
dom4jdocument.addElement("test"); 
} 

    private static Component createTree(org.dom4j.Document document) { 
      treeModel = new DocumentTreeModel(document); 
      TreeModelListener l = new TreeModelListener() { 

       @Override 
       public void treeStructureChanged(TreeModelEvent e) { 
        // TODO Auto-generated method stub 
        treeModel.reload(); 
       } 

       @Override 
       public void treeNodesRemoved(TreeModelEvent e) { 
        // TODO Auto-generated method stub 
        treeModel.reload(); 
       } 

       @Override 
       public void treeNodesInserted(TreeModelEvent e) { 
        // TODO Auto-generated method stub 
        treeModel.reload(); 
       } 

       @Override 
       public void treeNodesChanged(TreeModelEvent e) { 
        // TODO Auto-generated method stub 
        treeModel.reload(); 
       } 
      };;; 
      treeModel.addTreeModelListener(l); 
      JTree tree = new JTree(treeModel); 


      return tree; 
     } 
+0

失踪(或删除;-)通讯 – kleopatra 2011-04-07 22:25:33

回答

4

最可能DocumentTreeModel不像其任务那样激发适当的TreeModelEvents。在监听器中重新加载是没有意义的(这是完整的循环会引发事件;-),JTree本身正在监听模型并知道在接收插入内容时该如何处理。要检查,请在侦听器方法中插入简单的println。

编辑(在回答评论“我到底......” - 在这里更容易)

1)没有 - 至少没有其效应模型:一个乖巧的模型,你会以无限循环的结束(见下文)

2)循环(又名:完整圆形的)是:

模型火灾事件 - >侦听器能够接收事件 - >听者修改模型(model.reload) - >模型火灾事件 - > ...

+0

@Kim也许你应该阅读并了解TreeModel及其通知职责?这就是说,哪一部分对你来说毫无意义?你是否添加了代码(在监听器中)来检查你得到的通知? – kleopatra 2011-04-06 15:03:50

+0

downvoting这(可能是正确的,给出稀疏信息)答案不会帮助你解决问题;-) – kleopatra 2011-04-06 16:31:25