Обновление JtreeModel не работает, но Jtree обновляется соответствующим образом.

Я использую org.dom4j.swing.DocumentTreeModel для создания Swing Jtree из проанализированного документа DOM. Когда я редактирую документ, из которого построена модель дерева, я ожидаю, что Jtree немедленно отразит это с помощью treeModel.reload();

Проблема в том, что когда Jtree сначала полностью свернуто, а затем развернуто, щелкнув дерево, оно показывает 3 «тестовых» элемента. Однако в этот момент, когда я добавляю больше тестовых элементов, это изменение больше не отражается! Почему когда свинг Jtree находится в свернутом состоянии, он может отражать изменения, внесенные путем добавления в дерево дополнительных «тестовых» элементов, но не когда свинг Jtree расширяется.

Я полностью ожидал, что в реальном времени будет добавлено больше «тестовых» элементов, независимо от того, открыт ли свинг 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;
        }

person KJW    schedule 06.04.2011    source источник
comment
отсутствует (или удалено ;-) сообщение   -  person kleopatra    schedule 08.04.2011


Ответы (1)


скорее всего, DocumentTreeModel не запускает соответствующие события TreeModelEvents, поскольку это его задача. Нет смысла делать перезагрузку в слушателе (это полный цикл, если бы события были выброшены ;-), JTree сам прослушивает модель и знает, что делать при получении вставки. Для проверки вставьте простой println в методы прослушивателя.

отредактировать (в ответ на комментарий "а что я должен..." - тут проще)

1) ничего - по крайней мере ничего, что влияет на модель: с моделью с хорошим поведением вы окажетесь в бесконечном цикле (см. Ниже)

2) петля (иначе: полный цикл):

модель запускает событие --> слушатель получает событие --> слушатель изменяет модель (model.reload) --> модель запускает событие --> ...

person kleopatra    schedule 06.04.2011
comment
@ Ким, может быть, тебе следует прочитать и узнать о TreeModel и его обязанностях по уведомлению? Тем не менее, какая именно часть не имеет для вас смысла? Вы добавили код (в прослушиватель), чтобы проверить, какие уведомления вы получаете? - person kleopatra; 06.04.2011
comment
голосование против этого (вероятно, правильного, учитывая скудную информацию) ответа не поможет вам решить проблему ;-) - person kleopatra; 06.04.2011