2009-04-16 3 views
0

Я создаю модель JTree и модель для нее в классе, отдельном для класса GUI. Данные для JTree извлекаются из файла.Перезагрузка JTree во время выполнения

Теперь в классе GUI пользователь может добавлять файлы из файловой системы в список AWT. После того, как пользователь нажмет на файл в списке, я хочу обновить JTree. Имя переменной для JTree - schemaTree.

У меня есть следующий код для при выборе элемента в списке:

private void schemaListItemStateChanged(java.awt.event.ItemEvent evt) { 
     int selection = schemaList.getSelectedIndex(); 
     File selectedFile = schemas.get(selection); 
     long fileSize = selectedFile.length(); 
     fileInfoLabel.setText("Size: " + fileSize + " bytes"); 

     schemaParser = new XSDParser(selectedFile.getAbsolutePath()); 

     TreeModel model = schemaParser.generateTreeModel(); 
     schemaTree.setModel(model); 
} 

Я обновил код, чтобы соответствовать принятому ответу. JTree теперь корректно обновляется в зависимости от того, какой файл я выбираю в списке.

+0

Я отправил Следование на вопрос здесь: http://bit.ly/ iaDqS –

ответ

1

Я не уверен, что я понять ваш вопрос, но я буду стараться ...

Право, что нужно сделать должно быть, ИМХО:

  • получить файл
  • создать новый TreeModel из файла
  • дать модель в JTree

в псевдокоде это будет выглядеть так:

File newContent = getSelectedByUser(...); 
TreeModel newModel = new MyFileBasedTreeModel(newContent); 
//this next part must be done in the EventDispatcherThread 
myTree.setModel(newModel); 

тогда JTree будет обновляться, без вызова перекрасить и т.д.

Надеются, что это помогает

+1

Очень хорошо, теперь я изменил метод generateTree(), чтобы вернуть модель вместо дерева и переименовал метод generateTreeModel(). Дерево теперь корректно обновляется в зависимости от того, какой файл я нажимаю в списке. Благодаря! –

2

Из документов Component.add API.

Примечание: Если компонент был добавлен контейнер, который был отображается, Validate должен быть вызван на этот контейнер для отображения нового компонента. Если добавлено несколько компонентов, добавляется , вы можете повысить эффективность, вызвав только подтверждение только , после того как все компоненты добавлены .

Вы назвали repaint и validate на компоненте, который не отображается, что не будет эффективным. Вы должны вызвать эти методы на mainPanel после add. Также revalidate имеет тенденцию быть лучше, чем validate, поскольку он эффективно коалесцирует.

+0

Я пробовал revalidate на mainPanel, однако JTree по-прежнему не обновляется. Я изменю код в исходном вопросе до того, что у меня есть. –

+0

Похоже, вы не добавили новое дерево на панель. –

+0

Работает сейчас .. Я сейчас совсем не удаляю JTree, я просто не обновлял модель в нужном месте. Спасибо за ваш ответ –