Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 刷新JtreeModel不起作用,但Jtree会相应地更新_Java_Swing_Jtree_Dom4j_Treemodel - Fatal编程技术网

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

Java 刷新JtreeModel不起作用,但Jtree会相应地更新,java,swing,jtree,dom4j,treemodel,Java,Swing,Jtree,Dom4j,Treemodel,我正在使用org.dom4j.swing.DocumentTreeModel从解析的DOM文档构建swing Jtree。当我编辑构建treeModel的文档时,我希望Jtree能够通过treeModel.reload()立即反映这一点 问题在于,当Jtree首先完全折叠,然后通过单击树展开时,它会显示3个“test”元素。然而,在这一点上,当我添加更多的测试元素时,这种变化不再被反映出来!为什么当Jtree-swing处于折叠状态时,它能够反映通过向树中添加额外的“测试”元素所做的更改,但当J

我正在使用org.dom4j.swing.DocumentTreeModel从解析的DOM文档构建swing Jtree。当我编辑构建treeModel的文档时,我希望Jtree能够通过treeModel.reload()立即反映这一点

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

我完全希望无论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;
        }

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

编辑(回答“我应该做什么…”的评论-这里更简单)

1) 没有-至少没有影响模型的因素:有了一个行为良好的模型,你将陷入一个无休止的循环(见下文)

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


模型激发事件-->侦听器接收事件-->侦听器修改模型(model.reload)-->模型激发事件-->

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

编辑(回答“我应该做什么…”的评论-这里更简单)

1) 没有-至少没有影响模型的因素:有了一个行为良好的模型,你将陷入一个无休止的循环(见下文)

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


模型激发事件-->侦听器接收事件-->侦听器修改模型(model.reload)-->模型激发事件-->

@Kim也许你应该阅读并了解TreeModel及其通知责任?也就是说,哪一部分对你来说毫无意义?您是否添加了代码(在侦听器中)来检查您收到了哪些通知?向下投票(考虑到稀疏信息,可能是正确的)答案不会帮助您解决问题;-)@Kim也许你应该阅读并了解TreeModel及其通知责任?也就是说,哪一部分对你来说毫无意义?您是否添加了代码(在侦听器中)来检查您收到了哪些通知?向下投票(考虑到稀疏信息,可能是正确的)答案不会帮助您解决问题;-)缺少(或删除;-)通信缺少(或删除;-)通信