【问题标题】:Refreshing JtreeModel does not work but Jtree updates accordingly刷新 JtreeModel 不起作用,但 Jtree 会相应更新
【发布时间】:2011-04-06 09:06:37
【问题描述】:

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

问题是,当 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;
        }

【问题讨论】:

  • 缺少(或删除 ;-) 通信

标签: java swing jtree dom4j treemodel


【解决方案1】:

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

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

1) 什么都没有——至少没有什么会影响模型:对于一个表现良好的模型,你最终会陷入无限循环(见下文)

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

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

【讨论】:

  • @Kim 也许您应该阅读并了解 TreeModel 及其通知职责?也就是说,哪一部分对您来说完全没有意义?您是否添加了代码(在侦听器中)来检查您收到了哪些通知?
  • 否决这个(可能是正确的,考虑到稀疏信息)答案不会帮助您解决问题;-)
猜你喜欢
  • 1970-01-01
  • 2015-06-13
  • 2015-06-05
  • 2011-09-23
  • 1970-01-01
  • 2018-02-02
  • 2017-07-18
  • 2018-04-16
  • 1970-01-01
相关资源
最近更新 更多