刷新JtreeModel不起作用,但Jtree相应地更新

时间:2011-04-06 09:06:37

标签: java swing jtree dom4j treemodel

我使用org.dom4j.swing.DocumentTreeModel从解析的DOM文档构造Swing Jtree。当我编辑构造treeModel的文档时,我希望Jtree能够立即通过treeModel.reload();

来反映这一点。

问题是当Jtree首先完全折叠然后通过单击树展开时,它会显示3个“test”元素。但是,此时,当我添加更多测试元素时,此更改不再反映出来!为什么当Jtree swing处于折叠状态时,它能够通过向树中添加额外的“test”元素来反映所做的更改,而不是在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;
        }

1 个答案:

答案 0 :(得分:4)

最有可能的是,DocumentTreeModel不会像其任务一样触发相应的TreeModelEvents。在侦听器中进行重新加载没有任何意义(完整的循环会抛出事件;-),JTree本身正在监听模型并知道接收插入时要做什么。要检查,请在侦听器方法中插入简单的println。

编辑(回答评论“我应该怎么做......” - 这里更容易)

1)什么都没有 - 至少没有任何影响模型的东西:一个表现良好的模型你最终会陷入无尽的循环(见下文)

2)循环(又名:完整循环)是:

模型火灾事件 - >听众收到事件 - >监听器修改模型(model.reload) - >模型火灾事件 - > ......