Электронная библиотека » Тимур Машнин » » онлайн чтение - страница 7


  • Текст добавлен: 19 декабря 2023, 12:42


Автор книги: Тимур Машнин


Жанр: Компьютеры: прочее, Компьютеры


Возрастные ограничения: +12

сообщить о неприемлемом содержимом

Текущая страница: 7 (всего у книги 22 страниц) [доступный отрывок для чтения: 7 страниц]

Шрифт:
- 100% +

JMenuBar

Тяжеловесные окна верхнего уровня JFrame, JApplet и JDialog могут содержать панель меню горизонтально ниже заголовка окна.




Панель меню представлена классом JMenuBar.

Эта панель меню состоит из различных выборов меню, доступных конечному пользователю.

Кроме того, каждый выбор содержит список опций, который называется раскрывающимся меню.

Выбор меню представлен классом JMenu, а опция в списке представлена классом JMenuItem.

При этом видно, что класс JMenu расширяет класс JMenuItem.

Чем же отличаются выбор меню от опции в списке?

Во-первых, видно, что и тот и другой класс, это просто кнопки.

Но, выбор меню JMenu, в отличие от опции JMenuItem, обеспечивает всплывающее окно, содержащее JMenuItems, которое отображается, когда пользователь выбирает JMenu в панеле JMenuBar.

В дополнение к элементам JMenuItem, меню JMenu также может содержать разделители JSeparator.

По сути, меню представляет собой кнопку с ассоциированным всплывающим меню JPopupMenu.

Когда нажимается «кнопка», появляется всплывающее меню JPopupMenu.

Панель меню создается с помощью конструктора класса и добавляется в окно верхнего уровня методом setJMenuBar.



Затем создается само меню, которое добавляется в панель меню методом add.

Так как панель меню использует компоновку BoxLayout, а метод add позволяет добавлять любой Swing компонент, в панель меню можно добавить заполнитель класса Box, и меню окажется справа.



После создания панели меню и меню, в меню добавляются элементы меню, которые на самом деле содержатся в меню JPopupMenu, появляющемся при нажатии меню.



Элементы меню добавляются в меню методом add.

Туда же можно и добавлять разделители между элементами меню.

При создании элемента меню в нем можно задать текст, изображение, или сразу и то и другое с помощью конструктора класса JMenuItem.

Также, при создании элемента меню можно задать для него горячие клавиши, методом setAccelerator.

При этом горячие клавиши будут отображаться в элементе меню.

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

Для меню и элементов меню можно назначить мнемонику или клавиши выбора с помощью метода setMnemonic.



Здесь для меню File мы назначаем комбинацию клавиш Alt + F, при нажатии на которые открывается меню.

Затем мы назначаем мнемонику или клавишу Е для элемента меню Exit.

Чтобы воспользоваться этой клавишей, мы сначала нажимаем Alt + F, то есть открываем меню, а затем нажимаем E и срабатывает этот элемент меню.

В отличие от мнемоники, клавиши акселерации сразу нажимают элемент меню.

Меню и элемент меню также можно создать на основе объекта Action, инкапсулирующего свойства, которые могут быть повторно использованы.



Объект Action может быть использован для разделения функциональности и состояния от самого компонента.

Например, если у вас есть два или более компонента, которые выполняют одну и ту же функцию, можно использовать один объект Action для создания этих компонентов.

Объект Action – это слушатель действий, который обеспечивает не только обработку событий, но также централизованную обработку состояния компонентов, связанных с событием, таких как элементы меню.

Состояние, которое обрабатывается этим действием, включает в себя текст, значок, мнемонику, активацию и выбранный статус.

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

Далее мы создаем элемент меню на основе объекта Action и добавляем этот элемент в само меню.

JCheckboxMenuItem и JRadioButtonMenuItem

Помимо простого элемента меню, есть компоненты JCheckboxMenuItem и JRadioButtonMenuItem, представляющие флажок и радиокнопку для добавления в меню.




В этом примере обработчик выбора флажка позволяет динамически добавляет и удалять элементы меню.

Отследить состояние выбора флажка позволяет метод getState.

В этом примере мы создаем две радиокнопки и объединяем их в группу.



Чтобы могла быть выбрана только одна кнопка.

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

JPopupMenu

Всплывающее меню JPopupMenu используется обычно как контекстное меню.




Оно появляется при нажатии правой кнопки мыши на компоненте, к которому привязано.

Для создания всплывающего меню используется конструктор класса, в котором можно указать заголовок меню.

Затем создаются элементы меню, которые добавляются в всплывающее меню.

Для того чтобы всплывающее меню появилось, к компоненту добавляется слушатель событий мыши.

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

Всплывающие меню запускаются по-разному на разных платформах.

Поэтому событие isPopupTrigger следует проверять как в методе mousePressed, так и в методе mouseReleased для правильной межплатформенной функциональности.

JSpinner и JSlider

Компонент JSpinner работает аналогично компонентам JList и JComboBox, но вместе с компонентом JFormattedTextField.




В компоненте JList и JComboBox пользователь может выбирать ввод из заданного набора значений.

Компонент JSpinner также позволяет использовать этот тип выбора.

Другая половина компонента JSpinner – это форматированное поле JFormattedTextField.

В компоненте JSpinner, как отображать или вводить значение не контролируется средством отображения списка ListCellRenderer, как в JList.

Вместо этого вы получаете форматированное поле JFormattedTextField для ввода и пару стрелок для перемещения по различным значениям, доступным для форматированного поля.

Так как для ввода и отображения в компоненте JSpinner у нас есть форматированное поле JFormattedTextField, мы имеем три предустановленных типа ввода – это список строк, последовательность объектов Number, и последовательность объектов Date.

Для создания компонента JSpinner, сначала создается его модель данных.



Предустановленные модели данных – это SpinnerDateModel, SpinnerListModel, и SpinnerNumberModel.

Эти классы расширяют абстрактный класс AbstractSpinnerModel.

Поэтому, если вы хотите создать свою собственную модель данных, вам нужно создать свою собственную реализацию абстрактного класса AbstractSpinnerModel.

Здесь показано создание модели SpinnerListModel.

Сначала вы создаете массив или список строк, а затем на его основе создаете модель данных.

Далее вы создаете компонент JSpinner на основе модели данных.

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

Компонент JSpinner напрямую поддерживает один тип прослушивателя событий – это ChangeListener.

Этот слушатель уведомляется, когда вызывается метод commitEdit, сообщая, что значение счетчика изменилось.

По умолчанию, этот метод вызывается при нажатии стрелок для перемещения по различным значениям.

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



Для этого вам нужно обратиться к вспомогательному классу компонента JSpinner.

Для каждой из моделей данных компонента JSpinner, доступен вспомогательный класс ListEditor, DateEditor, NumberEditor, которые расширяют базовый класс DefaultEditor.

В то время как модель данных позволяет контролировать то, что выбирается для компонента, редакторы позволяют контролировать то, как отображать и редактировать каждое выбираемое значение.

Поэтому вы извлекаете из спиннера редактор, а из редактора извлекаете объект поля ввода.

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

Также вы можете использовать редактор спинера и соответственно поле ввода для контроля над отображением значений спиннера.



Здесь мы выравниваем значение по центру поля ввода.

Если вы хотите отображать в спиннере даты, вам нужно использовать модель данных SpinnerDateModel.



Здесь в конструкторе модели мы указываем текущее значение, начальное и конечное значения последовательности дат, ограничивая диапазон 100 годами.

Последним аргументом конструктора вы указываете шаг изменения даты.

Соответственно, в слушателе изменения свойства поля ввода, вы должны проверять, является ли вводимое значение объектом класса Date.

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



Затем вы должны установить этот редактор для спиннера методом setEditor.

Модель данных SpinnerNumberModel обеспечивает выбор номера из открытого или закрытого диапазона значений.



Это число может быть любым из подклассов класса Number, включая объекты Integer и Double.

Здесь в конструкторе модели мы также указываем текущее значение, начальное и конечное значения последовательности чисел, указывая шаг изменения значения.

В слушателе изменения свойства поля ввода, вы должны проверять, является ли вводимое значение объектом класса Number.

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



Затем вы должны установить этот редактор для спиннера методом setEditor.

Компонент JSlider представляет собой ползунок, с помощью которого пользователь может выбрать целое значение в указанном диапазоне.



Компонент JSlider создается с помощью конструктора, в котором можно указать его ориентацию, минимальное и максимальное значения диапазона и первоначальное значение ползунка.

Рядом с линейкой ползунка можно разметить шкалу со штрихами, отстоящими друг от друга на расстояние, устанавливаемое методом setMajorTickSpacing.

После определения расстояния шкала отображается методом setPaintTicks (true).

К штрихам можно добавить отображение числовых значений методом setPaintLabels (true).

Между штрихами можно отобразить более мелкие штрихи методом setMinorTickSpacing.

Если применить метод setSnapToTicks (true), то ползунок будет останавливаться только против штрихов.

Основную линейку ползунка можно убрать методом setPaintTrack (false), оставив только шкалу со штрихами.

По умолчанию числовые значения в шкале ставятся против каждого штриха.

Методом createStandardLabels можно изменить это правило, задав другой шаг расстановки чисел на шкале и другой начальный отсчет.

Затем эту таблицу нужно установить на шкале методом setLabelTable.

Можно создать свою таблицу меток штрихов, с помощью хэш-таблицы Hashtable, поместив в нее против каждого значения штриха свою метку.

После этого эта таблица устанавливается методом setLabelTable для ползунка.

В этом примере мы создаем ползунок и с помощью него динамически изменяем размеры кнопки.

JTree

Класс JTree представляет компонент Swing для отображения древовидных данных.




Дерево содержит один корневой объект root, далее размещаются его потомки узловые объекты node, имеющие своих потомков и одного предка parent.

На самом нижнем уровне расположены листья leaf – узлы, не имеющие потомков.

Как и все Swing компоненты, компонент JTree использует отдельный объект модели для хранения и представления данных, которые он отображает.

Большинство компонентов Swing автоматически создают этот объект модели, и вам не нужно явно с ним работать.

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

По умолчанию JFileChooser показывает все файлы в выбранном каталоге.

Ограничить отображение отдельными типами файлов, можно с помощью фильтра файлов.

Фильтр файлов представлен абстрактным классом FileFilter.

Можно напрямую реализовать этот класс, определив его метод accept, принимает ли фильтр этот файл, и метод getDescription, описание фильтра.

Или можно использовать готовую реализацию – класс FileNameExtensionFilter.

Фильтр FileNameExtensionFilter создается с помощью конструктора, в котором указывается отображаемое описание фильтра и набор допустимых расширений файлов.

Полученный фильтр устанавливается с помощью метода addChoosableFileFilter.

Можно создать несколько фильтров и добавить их в JFileChooser.

Тогда пользователь сможет выбирать фильтр в выпадающем списке.

По умолчанию в JFileChooser добавляется фильтр All Files.

Чтобы его убрать, используется метод setAcceptAllFileFilterUsed (false).

В компонент JFileChooser можно добавить Swing компонент с помощью метода setAccessory.



Например, окно предварительного просмотра выбранного файла.

В этом примере мы создаем класс, расширяющий класс JComponent, в котором мы присоединяем слушатель изменения свойства к JFileChooser.

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

JTable

Компонент JTable обеспечивает отображение таблицы данных, при необходимости позволяя пользователю редактировать данные.




Компонент JTable использует модель данных таблицы TableModel для управления фактическими данными таблицы, модель TableColumnModel, содержащую список столбцов таблицы, и модель выбора строк таблицы ListSelectionModel.

Компонент JTable использует редактор ячеек таблицы TableCellEditor, рендерер TableCellRenderer для отображения ячеек на экране, класс TableColumn для хранения информации о свойствах каждого столбца.

Видно, что архитектура компонента JTable довольно сложная.

Это сделано для максимального абстрагирования, чтобы пользователи Swing могли легко получить доступ, изменить и расширить все функциональные возможности.

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



Конструктор по умолчанию создает пустую таблицу без строк и столбцов с пустыми моделями данных.

Конструктор JTable (int rows, int columns) формирует пустую редактируемую таблицу с заданным числом строк и столбцов с моделью данных по умолчанию, которая предполагает хранить в таблице объекты типа Object в виде вектора типа Vector, состоящего из векторов.

Конструктор JTable (Object [] [] data, Object [] colNames) создает таблицу, заполненную объектами data.

Параметр colNames содержит имена столбцов таблицы.

Все строки массива data должны содержать столько же элементов, сколько существует в массиве colNames.

Конструктор JTable (Vector data, Vector colNames) делает то же самое, но параметры заданы векторами.

Преимущество этих конструкторов заключается в том, что они просты в использовании.

Однако эти конструкторы также имеют недостатки.

Они автоматически делают каждую ячейку доступной для редактирования.

Они обрабатывают все типы данных одинаково, как строки.

Например, если столбец таблицы имеет логические данные, таблица может отображать данные в виде флажка.

Однако, если вы используете один из этих двух простых конструкторов JTable, ваши логические данные отображаются в виде строки.

Кроме-того, при изменении данных, придется заново создавать таблицу, с новыми массивами.

Остальные конструкторы определяют таблицу с заранее заданными моделями данных.

Как уже было сказано, самый простой способ создать таблицу – это использовать конструктор на основе массивов данных, указав напрямую данные и заголовки столбцов.



Надо заметить, что заголовки столбцов появляются на экране, только если таблица заключена в панель JScrollPane.

Если при этом у столбцов не заданы имена, то они помечаются буквами A, B, C и т. д., как принято в электронных таблицах.

Если вы используете таблицу без панели прокрутки, вы должны получить компонент заголовка таблицы и добавить его в контейнер.

При вызове метода setFillsViewportHeight (true), таблица использует всю высоту контейнера, даже если таблица не имеет достаточного количества строк для использования всего вертикального пространства.

По умолчанию все столбцы в таблице начинаются с равной ширины и автоматически заполняют всю ширину таблицы.

Чтобы настроить начальную ширину столбцов, вы можете вызвать метод setPreferredWidth для каждого столбца таблицы.

Столбец таблицы получается из модели TableColumnModel, которая получается методом getColumnModel.

Разумеется, эта настройка будет действовать в рамках общей ширины таблицы.

По умолчанию таблица поддерживает выбор пользователем одной или нескольких строк.



Режим выбора устанавливается методом setSelectionMode на основе констант MULTIPLE_INTERVAL_SELECTION, SINGLE_INTERVAL_SELECTION, и SINGLE_SELECTION.

Обработать выбор пользователя, можно присоединив слушателя к модели выбора ListSelectionModel.

Эта модель получается методом getSelectionModel для таблицы.

По умолчанию вы получаете модель выбора строк.

Чтобы получить модель выбора столбцов, вы должны сначала вызвать метод getColumnModel, а затем метод getSelectionModel.

Также, по умолчанию, обработчик слушателя вызывается дважды – при нажатии клавиши мыши и при ее отпускании.

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

В обработчике слушателя мы используем методы getSelectedRows и getSelectedColumns таблицы, чтобы получить значение выбранной ячейки.

Как уже было сказано, по умолчанию, пользователь выбирает строку.

Чтобы пользователь мог выбрать одну ячейку, используется метод setCellSelectionEnabled (true).

Выбор столбца пользователем также можно отследить с помощью слушателя события изменения модели столбца TableColumnModel, который добавляется методом addColumnModelListener.



Модель столбца TableColumnModel отвечает за добавление или удаление столбцов, их перестановку, и выделение столбцов.

Отслеживание выделения отдельной ячейки таблицы будет более точным одновременно с помощью модели выбора строки и модели выбора столбца, так как при выделенной строке или столбце вы не отследите выбор других ячеек в той же строке или столбце.

Чтобы отделить данные от таблицы, используется модель данных TableModel.



Модель хранения содержимого ячеек таблицы описана интерфейсом TableModel, который частично реализован абстрактным классом AbstractTableModel и полностью реализован его подклассом DefaultTableModel.

Если программист не предоставляет объект модели таблицы, компонент JTable автоматически создает экземпляр DefaultTableModel.

Поэтому использование модели DefaultTableModel по сути ничем не отличается от использования простых конструкторов класса JTable.

DefaultTableModel – это реализация интерфейса TableModel, которая использует вектор векторов для хранения объектов значений ячейки.

Предположим, мы хотим отобразить в таблице не просто строки, а произвольные объекты, например, экземпляры класса User.

Тогда при использовании простого конструктора или модели DefaultTableModel, мы должны создать массив данных, в котором явно извлекаем из объекта строку как значение ячейки.

Или объект должен быть совсем простым, с одним полем и методом toString, который возвращает значение этого поля.

Чтобы оперировать произвольными объектами, и даже иметь возможность размещать объекты разных типов в разных ячейках таблицы, нам нужно создать свою модель.

Внимание! Это не конец книги.

Если начало книги вам понравилось, то полную версию можно приобрести у нашего партнёра - распространителя легального контента. Поддержите автора!

Страницы книги >> Предыдущая | 1 2 3 4 5 6 7
  • 4 Оценок: 1

Правообладателям!

Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.

Читателям!

Оплатили, но не знаете что делать дальше?


Популярные книги за неделю


Рекомендации