DefaultTreeModel метод setRoot()
От: tipoc  
Дата: 07.01.11 05:10
Оценка:
Всем привет!

Есть дерево JTree. Для него использую модель DefaultTreeModel. Изначально в нем root = null.
Далее делаю treeModel.setRoot(rebuildRoot()). Т.е. создаю рута и кладу его в дерево.
Проблема в том, что дерево не обновляется. Приходится заново создавать дерево с обновленной моделью.

Вобщем мне нужно динамически обновлять все дерево. Гугл к сожалению не помог.

Может кто с таким сталкивался?
Re: DefaultTreeModel метод setRoot()
От: tipoc  
Дата: 07.01.11 05:13
Оценка:
Здравствуйте, tipoc, Вы писали:

T>Всем привет!


T>Есть дерево JTree. Для него использую модель DefaultTreeModel. Изначально в нем root = null.

T>Далее делаю treeModel.setRoot(rebuildRoot()). Т.е. создаю рута и кладу его в дерево.
T>Проблема в том, что дерево не обновляется. Приходится заново создавать дерево с обновленной моделью.

T>Вобщем мне нужно динамически обновлять все дерево. Гугл к сожалению не помог.


T>Может кто с таким сталкивался?


Да, динамически обновлять все дерево необходимо для постраничной разбивки (при переходе с одной страницы на другую). Сейчас приходится создавать дерево заново, что совсем не есть гуд (не в плане оптимизации, а по другим соображениям).
Re: DefaultTreeModel метод setRoot()
От: xBlackCat Россия  
Дата: 07.01.11 17:28
Оценка:
Здравствуйте, tipoc, Вы писали:

T>Всем привет!


T>Есть дерево JTree. Для него использую модель DefaultTreeModel. Изначально в нем root = null.

T>Далее делаю treeModel.setRoot(rebuildRoot()). Т.е. создаю рута и кладу его в дерево.
T>Проблема в том, что дерево не обновляется. Приходится заново создавать дерево с обновленной моделью.

T>Вобщем мне нужно динамически обновлять все дерево. Гугл к сожалению не помог.


T>Может кто с таким сталкивался?


Покажи код. Со слов получается, что дерево и модель не знают друг о друге. Или неправильно используется модель.
Rojac — Rsdn Offline JAva Client
Анонсы и обсуждение здесь
Автор: xBlackCat
Дата: 08.02.10
Re[2]: DefaultTreeModel метод setRoot()
От: tipoc  
Дата: 07.01.11 20:23
Оценка:
Здравствуйте, xBlackCat, Вы писали:

BC>Здравствуйте, tipoc, Вы писали:


T>>Всем привет!


T>>Есть дерево JTree. Для него использую модель DefaultTreeModel. Изначально в нем root = null.

T>>Далее делаю treeModel.setRoot(rebuildRoot()). Т.е. создаю рута и кладу его в дерево.
T>>Проблема в том, что дерево не обновляется. Приходится заново создавать дерево с обновленной моделью.

T>>Вобщем мне нужно динамически обновлять все дерево. Гугл к сожалению не помог.


T>>Может кто с таким сталкивался?


BC>Покажи код. Со слов получается, что дерево и модель не знают друг о друге. Или неправильно используется модель.

Да по ходу у меня в коде проблема. Т.к. сделал отдельный сэмпл — все нормально работает.
А так в моей программе код размазан по нескольким методам. Вот привожу эти методы (в той последовательности, в которой они вызываются):
@Override
protected void initTreeModel() {
   treeModel = new DefaultTreeModel(null);
}



protected void initTree() {
    if (scrollPane != null) remove(scrollPane);

    createTree();
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    tree.getSelectionModel().addTreeSelectionListener(this);

    if (isTreeEditable()) {
        tree.setEditable(true);
        tree.setCellEditor(getTreeCellEditor());
    }
    tree.setShowsRootHandles(true);
    tree.setRootVisible(false);
    tree.putClientProperty("JTree.lineStyle", "None");
    //Enable tool tips.
    ToolTipManager.sharedInstance().registerComponent(tree);

    tree.setCellRenderer(getTreeCellRenderer());

    scrollPane = new JScrollPane(tree);

    tree.addMouseListener(getTreeMouseListener());

    add(scrollPane, BorderLayout.CENTER);
    validate();
}



public void createTree() {
    if (isTreeEditable()) {
        tree = new JTree(treeModel) {
            @Override
            public boolean isPathEditable(TreePath path) {
                return isTreePathEditable(path);
            }
        };
    } else {
        tree = new JTree(treeModel);
    }
}



@Override
protected void loadDataToPage() {    
    treeModel.setRoot(rebuildRoot());
}
Re[3]: DefaultTreeModel метод setRoot()
От: tipoc  
Дата: 07.01.11 20:27
Оценка:
Да, пытался делать так:
((DefaultTreeModel)tree.getModel()).setRoot(rebuildRoot())

Но все равно не помогает.
Распечатывал также объекты tree и treeModel. Вроде все правильно.
Re[3]: DefaultTreeModel метод setRoot()
От: xBlackCat Россия  
Дата: 07.01.11 21:33
Оценка:
А каким образом происходит изменение модели? Используются методы DefaultTreeModel#insertNodeInto(...), DefaultTreeModel#valueForPathChanged(...) и DefaultTreeModel#removeNodeFromParent(..)? Или изменения делаются на самих объектах? Если изменения делаются на самих объектах — то это в корне не правильно.
Rojac — Rsdn Offline JAva Client
Анонсы и обсуждение здесь
Автор: xBlackCat
Дата: 08.02.10
Re[4]: DefaultTreeModel метод setRoot()
От: tipoc  
Дата: 07.01.11 21:39
Оценка:
Здравствуйте, xBlackCat, Вы писали:

BC>А каким образом происходит изменение модели? Используются методы DefaultTreeModel#insertNodeInto(...), DefaultTreeModel#valueForPathChanged(...) и DefaultTreeModel#removeNodeFromParent(..)? Или изменения делаются на самих объектах? Если изменения делаются на самих объектах — то это в корне не правильно.


Я просто строю модель заново (в методе rebuildRoot()). Т.е. юзер находится например на 1 странице — я построил модель со 100 узлами, юзер перешел на 2 страницу — построил модель с другими 100 узлами и т.д.
Конкретно, изменение модели идет через метод setRoot. Моя цель — использовать одни и те же объекты JTree и DefaultTreeModel.
Описанные вами методы я не использую.
Re[5]: DefaultTreeModel метод setRoot()
От: xBlackCat Россия  
Дата: 07.01.11 22:01
Оценка:
Здравствуйте, tipoc, Вы писали:

T>Я просто строю модель заново (в методе rebuildRoot()). Т.е. юзер находится например на 1 странице — я построил модель со 100 узлами, юзер перешел на 2 страницу — построил модель с другими 100 узлами и т.д.

T>Конкретно, изменение модели идет через метод setRoot. Моя цель — использовать одни и те же объекты JTree и DefaultTreeModel.
T>Описанные вами методы я не использую.

По приведённому коду, осталось только одно предположение — не возвращает ли rebuildRoot() во второй раз тоже самое, что и в первый?
Rojac — Rsdn Offline JAva Client
Анонсы и обсуждение здесь
Автор: xBlackCat
Дата: 08.02.10
Re[6]: DefaultTreeModel метод setRoot()
От: tipoc  
Дата: 07.01.11 22:07
Оценка:
Здравствуйте, xBlackCat, Вы писали:

BC>Здравствуйте, tipoc, Вы писали:


T>>Я просто строю модель заново (в методе rebuildRoot()). Т.е. юзер находится например на 1 странице — я построил модель со 100 узлами, юзер перешел на 2 страницу — построил модель с другими 100 узлами и т.д.

T>>Конкретно, изменение модели идет через метод setRoot. Моя цель — использовать одни и те же объекты JTree и DefaultTreeModel.
T>>Описанные вами методы я не использую.

BC>По приведённому коду, осталось только одно предположение — не возвращает ли rebuildRoot() во второй раз тоже самое, что и в первый?

Я до второго вызова rebuildRoot() пока не дохожу. Я захожу на первую страницу и уже на этом этапе дерево не показывается.
Re[7]: DefaultTreeModel метод setRoot()
От: xBlackCat Россия  
Дата: 09.01.11 03:16
Оценка:
Здравствуйте, tipoc, Вы писали:

T>Я до второго вызова rebuildRoot() пока не дохожу. Я захожу на первую страницу и уже на этом этапе дерево не показывается.


Существенное замечание, которое должно было бы озвучено ранее.

Попробуй инициировать дерево ДО показа компонента. Или добавь вызов метода invalidate() на контейнере, ПОСЛЕ добавления в него дерева.
Rojac — Rsdn Offline JAva Client
Анонсы и обсуждение здесь
Автор: xBlackCat
Дата: 08.02.10
Re[8]: DefaultTreeModel метод setRoot()
От: tipoc  
Дата: 09.01.11 16:49
Оценка:
Здравствуйте, xBlackCat, Вы писали:

BC>Здравствуйте, tipoc, Вы писали:


T>>Я до второго вызова rebuildRoot() пока не дохожу. Я захожу на первую страницу и уже на этом этапе дерево не показывается.


BC>Существенное замечание, которое должно было бы озвучено ранее.


BC>Попробуй инициировать дерево ДО показа компонента. Или добавь вызов метода invalidate() на контейнере, ПОСЛЕ добавления в него дерева.


Все равно не помогает. Ладно, я уже остановился на том, что просто заново инициализирую дерево после вызова setRoot(). Так что тему можно считать закрытой.
Re: DefaultTreeModel метод setRoot()
От: Nicht Россия  
Дата: 11.01.11 07:24
Оценка:
Здравствуйте, tipoc, Вы писали:

T>Всем привет!


T>Есть дерево JTree. Для него использую модель DefaultTreeModel. Изначально в нем root = null.

T>Далее делаю treeModel.setRoot(rebuildRoot()). Т.е. создаю рута и кладу его в дерево.
T>Проблема в том, что дерево не обновляется. Приходится заново создавать дерево с обновленной моделью.

T>Вобщем мне нужно динамически обновлять все дерево. Гугл к сожалению не помог.


T>Может кто с таким сталкивался?


Может ты используешь какой то сторонний LookAndFeel, который криво обрабатывает ивенты от модели?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.