Я пытаюсь динамически использовать компонент 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();
}
но это тоже не помогло.