Однако компонент JTree отображает данные, которые намного сложнее, чем данные типичного компонента Swing.
Когда вы работаете с JTree, вы должны явно использовать объект модели.
Объект JTree создается с помощью конструктора, который может быть пустым, и тогда вам нужно установить модель данных методом setModel.
Следующие три конструктора создают дерево без объекта корневого узла.
Полноценное дерево вы можете создать, передав в конструктор модель данных, реализующую интерфейс TreeModel.
Существует класс DefaultTreeModel, реализующий этот интерфейс.
Объект этого класса создается на основе корневого узла, который содержит все остальные узлы.
Поэтому для дерева JTree предусмотрен конструктор, который создает дерево сразу на основе корневого узла.
Корневой узел – это объект, реализующий интерфейс TreeNode.
Существует класс DefaultMutableTreeNode, реализующий этот интерфейс.
Поэтому самый простой способ построения дерева, это создать корневой узел DefaultMutableTreeNode, затем добавить к нему дочерние узлы, а затем добавить дочерние узлы к каждому из них по мере необходимости.
Как правило, дерево помещается в панель с прокруткой, чтобы развернутое дерево поместилось во фрейм.
При этом указывается число строк, помещающихся в панели, с помощью метода setVisibleRowCount.
Здесь мы создали дерево строк.
Однако можно создать дерево произвольных объектов.
Одно условие – объект должен иметь метод toString, возвращающий строку, которая и будет отображаться на экране в дереве.
По умолчанию, узлы дерева имеют режим множественного выбора, то есть их можно выбирать с нажатой клавишей Ctrl.
Для того чтобы ограничить выбор одним узлом, нужно получить модель выбора дерева и установить для этой модели режим выбора одного узла.
К дереву можно присоединить слушателя выбора узла, в обработчике которого можно получить объект выбранного узла с помощью метода getLastSelectedPathComponent.
И дальше уже с этим объектом работать.
Вы также можете редактировать текст в каждом узле, вызвав метод setEditable (true) для дерева.
В этом случае после редактирования узла, дерево будет отображать новую строку и в обработчике слушателя TreeSelectionListener, метод getLastSelectedPathComponent будет возвращать уже измененный узел.
Так как при редактировании мы изменяем модель данных дерева, отследить редактирование узла мы можем с помощью слушателя изменений модели данных дерева.
В обработчике событий treeNodesChanged этого слушателя, мы с помощью метода getTreePath получаем родителя измененных узлов.
И если это не корневой узел, берем первый дочерний узел, который мы и редактируем.
Значение узла и будет новым отредактированным значением.
Помимо присоединения слушателя, модель данных DefaultTreeModel позволяет вставить узел в дерево с помощью метода insertNodeInto и удалить узел из дерева с помощью метода removeNodeFromParent.
За редактирование дерева отвечает редактор TreeCellEditor, который можно получить методом getCellEditor.
TreeCellEditor – это интерфейс.
Реализация этого интерфейса по умолчанию – это класс DefaultTreeCellEditor, к объекту которого можно присоединить слушатель редактирования узла CellEditorListener.
В обработчике этого слушателя editingStopped окончания редактирования, также можно отследить новое значение узла дерева.
Свой редактор DefaultTreeCellEditor можно создать с помощью конструктора, в котором указывается дерево, объект DefaultTreeCellRenderer, отвечающий за отображение дерева, и редактор DefaultCellEditor, отвечающий за редактирование узла дерева.
В свою очередь редактор DefaultCellEditor можно создать на основе флажка, выпадающего списка и текстового поля (по умолчанию).
Здесь показан пример создания редактора дерева, использующего для редактирования узла выпадающий список.
Если для создания дерева не устраивает предоставленная по умолчанию модель данных DefaultTreeModel, вы создаете свою, реализуя интерфейс TreeModel.
Если не устраивает предоставленный по умолчанию редактор, вы создаете свой, реализуя интерфейс TreeCellEditor.
Если не устраивает отображение узлов, вы реализуете интерфейс TreeCellRenderer.
И вам самостоятельное задание – написать дерево с контекстным меню, которое позволяет добавить и удалить узлы дерева.
JFileChooser
Компонент JFileChooser обеспечивает диалоговое окно, с помощью которого пользователь может выбрать файл, который затем будет использоваться приложением.
Компонент JFileChooser создается с помощью конструктора, в котором можно указать изначально открывающийся каталог.
По умолчанию открывается каталог Документы пользователя.
По умолчанию, пользователь может выбирать только файлы.
Чтобы пользователь смог выбрать также и каталог, нужно вызвать метод setFileSelectionMode с константой FILES_AND_DIRECTORIES.
По умолчанию JFileChooser не отображает скрытые файлы.
Чтобы установить их отображение, нужно вызвать метод setFileHidingEnabled (false).
По умолчанию, пользователь может выбрать только один файл.
Возможность выбора нескольких файлов задается методом setMultiSelectionEnabled (true).