Читаем Графические интерфейсы пользователя Java полностью

Однако компонент 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).

Перейти на страницу:

Похожие книги

Programming with POSIX® Threads
Programming with POSIX® Threads

With this practical book, you will attain a solid understanding of threads and will discover how to put this powerful mode of programming to work in real-world applications. The primary advantage of threaded programming is that it enables your applications to accomplish more than one task at the same time by using the number-crunching power of multiprocessor parallelism and by automatically exploiting I/O concurrency in your code, even on a single processor machine. The result: applications that are faster, more responsive to users, and often easier to maintain. Threaded programming is particularly well suited to network programming where it helps alleviate the bottleneck of slow network I/O. This book offers an in-depth description of the IEEE operating system interface standard, POSIX (Portable Operating System Interface) threads, commonly called Pthreads. Written for experienced C programmers, but assuming no previous knowledge of threads, the book explains basic concepts such as asynchronous programming, the lifecycle of a thread, and synchronization. You then move to more advanced topics such as attributes objects, thread-specific data, and realtime scheduling. An entire chapter is devoted to "real code," with a look at barriers, read/write locks, the work queue manager, and how to utilize existing libraries. In addition, the book tackles one of the thorniest problems faced by thread programmers-debugging-with valuable suggestions on how to avoid code errors and performance problems from the outset. Numerous annotated examples are used to illustrate real-world concepts. A Pthreads mini-reference and a look at future standardization are also included.

David Butenhof

Программирование, программы, базы данных
Разработка ядра Linux
Разработка ядра Linux

В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.

Роберт Лав

Программирование, программы, базы данных / Программирование / Книги по IT