Обновление JtreeModel не работает, но Jtree обновляет соответственно - PullRequest
0 голосов
/ 06 апреля 2011

Я использую org.dom4j.swing.DocumentTreeModel для создания Swing Jtree из проанализированного документа DOM.Когда я редактирую документ, из которого построено treeModel, я ожидаю, что 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;
        }

1 Ответ

4 голосов
/ 06 апреля 2011

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

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

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

2) цикл (он же полный круг):

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

...