Перезагрузка JTree во время выполнения - PullRequest
0 голосов
/ 16 апреля 2009

Я создаю JTree и модель для него в классе, отдельном от класса GUI. Данные для 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 теперь корректно обновляется в зависимости от того, какой файл я выбрал в списке.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2009

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

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

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

1 голос
/ 17 апреля 2009

Я не уверен, что понимаю ваш вопрос, но попробую ...

Правильно должно быть, ИМХО:

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

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

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

тогда JTree будет обновлен, без необходимости перерисовки и т. Д.

Надеюсь, это поможет

...