JTree обновляется после установки новой модели jtree - PullRequest
0 голосов
/ 20 марта 2011

Я пытаюсь динамически использовать компонент JTree.Под корневым узлом у меня есть четыре узла, и один из них («Операции») может иметь от 0 до нескольких детей.Это устанавливается пользователем через редактируемый список в отдельном окне, открытом по запросу пользователя.После редактирования этого списка пользователь нажимает кнопку «Сохранить», и тогда должно произойти волшебство.Отредактированный список отправляется на сервер (на самом деле на той же машине, так что это не занимает много времени), окно со списком закрывается, но прямо перед этим главное окно (с jtree) получает запрос на обновление, и я вижучто он делает то, что сказано в выводе журнала, но изменения не отображаются на экране.

Я использую DefaultTreeModel, этот метод вызывается для создания модели в начале (при первом открытии окна) ипосле изменения обновить новую модель с новой структурой.с помощью dmtn.getLeafCount () я вижу, что недавно загруженная структура с сервера является правильной с измененным числом листьев в разделе «Операции»

public DefaultTreeModel getDataStructure() {
    int dataID = task.getData().getId();
    LoggerUtility.logger.info("Data ID: " + dataID);
    DefaultMutableTreeNode dmtn = Manager.manager.getDataStructure(task.getId());
    LoggerUtility.logger.info("DTMN created "+dmtn.getLeafCount());

    return new DefaultTreeModel(dmtn);
}

метод, используемый для обновления jtree, выглядит следующим образом (этоочень грязно):

public void updateTree(){
    taskDataTree.setModel(getDataStructure());
    ((DefaultTreeModel)taskDataTree.getModel()).reload();
    this.revalidate();
    this.repaint();
    taskDataTree.revalidate();
    taskDataTree.repaint();
    taskDataTree.updateUI();
    taskDataTree.setVisible(false);
    taskDataTree.setVisible(true);
    jScrollPane2.setViewportView(taskDataTree);
}

Это очень грязно, потому что я пытался найти там все возможные решения моей проблемы, которые я нашел на форумах, я также пытался с моей собственной реализацией древовидной модели, которая вызывала бы fireTreeStructureChanged (...) но это также не изменилось.

Я, вероятно, также должен добавить, что я использую Netbeans GUI Builder для создания моего графического интерфейса, хотя я не знаю, имеет ли это какое-либо отношение к этому.

Я был бы очень признателен за любую помощь с этим

BR Lucja

РЕДАКТИРОВАТЬ !!! Я также пытался поместить его в другой поток, как это:

public void updateTree() {

    SwingWorker sw = new SwingWorker() {

        @Override
        protected Object doInBackground() throws Exception {
            taskDataTree.setModel(getDataStructure());
            ((DefaultTreeModel) taskDataTree.getModel()).reload();
            taskDataTree.revalidate();
            taskDataTree.repaint();
            taskDataTree.updateUI();
            taskDataTree.setVisible(false);
            taskDataTree.setVisible(true);
            jScrollPane2.setViewportView(taskDataTree);
            return null;
        }
    };
    sw.execute();
}

но это тоже не помогло.

Ответы [ 3 ]

2 голосов
/ 20 марта 2011
tree.setModel( anotherModel );

Это единственная строка кода, которая вам нужна.

Если это не работает, то это означает, что переменная дерева не содержит ссылку на дерево, которое было добавлено в GUI. Возможно, у вас есть переменная класса и локальная переменная с тем же именем.

0 голосов
/ 20 марта 2011

В принципе, это должно работать следующим образом (когда вы устанавливаете новую модель, дерево перезагружается само).(Это не самый эффективный способ, лучше пусть модель отправляет соответствующие события, когда она изменяется.)

Если это не работает, убедитесь, что вы вызываете метод setModel в потоке диспетчеризации событий AWT (например, с помощью EventQueue.invokeLater (или SwingUtilities.invokeLater, что тоже самое). Я думаю, вам не нужны все ваши вызовы revalidate(), repaint() и т. д. (и updateUI следует выполнять, только если вы измениликонфигурация внешнего вида).

0 голосов
/ 20 марта 2011

С моей точки зрения, собственная реализация TreeModel была хорошим подходом. Но я знаю, что создать TreeModelEvent с правильными данными не так просто.

Я бы предложил обновить ваш вопрос с помощью вашей реализации TreeModel, чтобы мы могли найти проблему с ним.

...