На заметку:
На этом занятии мы будем иметь дело с простыми приложениями, точнее, с простым графическим интерфейсом. Более сложные варианты рассматриваются на следующем занятии.
Все перечисленные элементы условно можно разделить на два типа: компоненты и контейнеры. От контейнера компонент отличается тем, что может содержать (и, как правило, содержит) другие компоненты и контейнеры. Компонент, в свою очередь, для отображения на экране должен быть включен в состав контейнера. Поэтому, по крайней мере, один контейнер при создании графического интерфейса придется использовать. Если контейнеров в программе несколько, то один всегда является контейнером верхнего уровня, в котором содержатся все прочие компоненты и контейнеры.
Контейнеры, в свою очередь, делятся на два типа или две категории. Одну небольшую группу формируют контейнеры верхнего уровня. Им соответствуют классы JFrame, JWindow, JDialog и JApplet. Эти классы, через систему наследования, являются потомками класса Container библиотеки AWT.
Система наследования, в той части, которая касается четырех упомянутых классов JFrame, JWindow, JDialog и JApplet, следующая. В вершине иерархии находится класс Object. Его наследует класс Component. Класс Container является подклассом класса Component. Класс JApplet реализуется через схему наследования Container-Pane-Applet-JApplet. Три другие схемы наследования: Container>Window-JWindow, Container>Window^ Dialog^-JDialog, и Container//Window-Frame^JFrame. Классы, не содержащие начальной литеры J в названии, относятся к библиотеке AWT, то есть соответствуют "тяжелым" компонентам.
Эти четыре контейнера относятся к "тяжеловесным", и один из них обычно находится в вершине иерархии компонентов программы. Мы будем для этих целей пользоваться классом JFrame. На последующих занятиях, где обсуждаются апплеты, в качестве контейнера верхнего уровня будет использоваться класс JApplet.
Прочие контейнеры, которые образуют многочисленную группу, относятся к "легковесным". Они, как и обычные компоненты библиотеки Swing, являются потомками класса JComponent. Принципиальное отличие легковесного контейнера от обычного легковесного компонента состоит в том, что в контейнер могут добавляться компоненты (и контейнеры). Поэтому деление на контейнеры и обычные компоненты достаточно условное. Обычно понять, относится ли компонент к контейнерам, достаточно легко исходя из общего назначения компонента. Например, такой компонент, как панель (класс JPane), предназначен для размещения на нем компонентов. Понятно, что это контейнер. Кнопка (класс JButton) вряд ли будет содержать другие графические компоненты. Наоборот, она сама должна где-то размещаться. Поэтому кнопка к контейнерам не относится.
На заметку:
Класс JComponent является непосредственным потомком класса Container.
В
табл. 1 приведен перечень классов
библиотеки Swing,
используемых для создания
различных компонентов (в том числе и
контейнеров).
Класс |
Описание |
JComboBox |
Класс для создания раскрывающихся списков |
JComponent |
Суперкласс для классов компонентов |
JDesktopPane |
Контейнер, используемый для создания многодокументного интерфейса |
JDialog |
Контейнер верхнего уровня для создания диалоговых окон |
JEditorPane |
Класс для создания панели редактирования с поддержкой стилей |
JFileChooser |
Класс для создания диалогового окна выбора файлов |
JFormattedTextField |
Класс для создания поля редактирования с поддержкой форматирования |
JFrame |
Класс для создания окна |
JI interna 1 Frame |
Класс для создания внешнего окна, которое может содержать внутренние подокна |
JLabel |
Класс для создания меток |
JLayeredPane |
Класс для управления механизмом перекрытия компонентов |
JList |
Класс для создания списка |
JMenu JMenuBar |
Класс для создания стандартного меню Класс для создания меню верхнего уровня |
JMenuItem |
Класс для реализации пункта меню |
JOptionPane |
Класс для работы с основными типами диалоговых окон |
JPanel- |
Класс панели |
JPasswordField |
Класс для создания поля ввода пароля |
JPopupMenu |
Класс для создания контекстного меню |
JProgressBar |
Класс для создания индикатора хода процесса |
JRadioButton |
Класс для создания переключателя опции |
JRadioButtonMenuItem |
Класс для создания меню в виде переключателя опций |
JRootPane |
Класс корневой панели |
JScrollBar |
Класс для создания полосы прокрутки |
JScrollPane |
Класс для создания панели с полосой прокрутки |
• JSeparator |
Класс для создания разделителя в меню |
JSlider |
Класс для создания линейного регулятора |
JSpinner |
Класс для создания инкрементного регулятора (список с кнопками со стрелками, предназначенными для изменения значения в списке) |
Класс |
Описание |
JSplitPane |
Класс для создания специальной панели, состоящей из двух частей с подвижным разделителем |
JTabbedPane |
Класс для создания панели с вкладками |
JTable |
Класс для создания таблиц |
JTextArea |
Класс для создания текстовой области |
JTextField |
Класс для создания поля редактирования |
JTextPane |
Класс текстовой панели широкого спектра |
JToggleButton |
Класс для создания кнопки с двумя состояниями |
JToolBar |
Класс для создания панели инструментов |
JToolTip JTree |
Класс предназначен для реализации оперативных подсказок для элементов интерфейса Класс для реализации древовидной иерархической структуры данных |
JViewport |
Класс реализации канала просмотра |
JWindow |
Контейнер для реализации окон (без строки названия и системных пиктограмм) |
Несложно заметить, что названия всех классов начинаются с литеры J. Для создания того или иного компонента в программе и размещения его в нужном месте необходимо фактически создать объект класса соответствующего компонента или его подкласса. Но этого мало. Необходимо также "оживить" компоненты графического интерфейса, то есть предусмотреть реакцию разных компонентов на действия пользователя. Для этих целей используется система обработки событий. Здесь отметим только общие принципы, а конкретную реализацию программного кода, в соответствии с этими принципами, будем изучать на примерах.
В принципе, для каждого компонента существует стандартный набор действий, на которые компонент может реагировать. В Java используется модель обработки событий с делегированием. Реализуется она по следующей схеме. В компонентах, с которыми что-то может происходить, регистрируются специальные обработчики событий. Когда в компоненте происходит событие, управление передается обработчику этого события, зарегистрированному в компоненте. Обработчик выполняет нужные действия и возвращает управление компоненту. В роли обработчика событий выступают объекты специальных классов. Эти классы создаются путем расширения интерфейсов, предназначенных для обработки того или иного события. Другими словами, для тех событий, которые могут происходить в компоненте, определены встроенные интерфейсы. Чтобы создать обработчик события, необходимо реализовать этот интерфейс в классе и создать объект этого класса. Такой объект может использоваться в качестве обработчика события. Все это в теории. Посмотрим, как такая схема реализуется на практике. Но для начала разберем наиболее простой пример, в котором обработка событий как таковая вообще отсутствует.
Создание простого окна
Рассмотрим пример, в котором создается очень простое окно. Окно не содержит ничего, кроме строки названия с именем окна и стандартными системными пиктограммами. Для создания окна используем класс контейнера JFrame. Обратимся к программному коду, представленному в листинге 1.
Листинг 1. Создание простого окна
import javax.swing.*; // Класс окна: class NewFrame{
// Конструктор класса: NewFrame(){
// Создание окна - объекта класса JFrame.
// Текстовый аргумент конструктора задает имя окна:
JFrame MyFrame=new JFrame("Новое окно");
II Установка размеров окна (в пикселях по ширине и высоте): MyFrame.setSize(300, 200) ;
// Реакция окна на щелчок на системной пиктограмме закрытия окна: MyFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Отображение окна: MyFrame.setvisible(true);
}}
public class NewFrameDemo{
public static void main(String[] args)(
// Анонимный объект класса NewFrame - объект окна: new NewFrame();}
}
Программа состоит из двух классов. Интерес представляет в первую очередь класс NewFrame, который является классом окна, которое создается и используется в программе. Этот класс состоит из единственного конструктора (кроме конструктора в классе NewFrame больше нет ни методов, ни полей). Поэтому функциональность класса полностью определяется кодом его конструктора. В конструкторе первой командой JFrame MyFrame =new JFrame ("Новое окно") создается объект MyFrame класса JFrame. Это и есть окно! Текстовый аргумент конструктора (фраза "Новое окно") задает название окна. Это название отображается в полосе названий окна. Но создать окно - мало. Необходимо выполнить настройку его параметров и отобразить окно на экране.
Для настройки параметров окна используются методы класса JFrame (), которые вызываются из объекта класса (объекта окна - в данном случае через объектную переменнуюMyFrame).Так,командойMyFrame.setSize (300, 200) задаются размеры окна. Первым аргументом методу setSize () передается целое число, определяющее ширину окна в пикселях. Второй аргумент метода setSize() - высота окна в пикселях. Кроме этого, нужно предусмотреть возможность убрать окно с экрана. Дело в том, что хотя системные пиктограммы в строке названия окна по умолчанию отображаются, закрытие окна с помощью соответствующей системной пиктограммы к завершению программы не приводит. Исправить ситуацию просто. Достаточно вызывать метод setDef aultCloseOperation (), указав аргументом константу из класса JFrame. Для того чтобы работа программы при щелчке на пиктограмме завершалась, передаем аргументом константу JFrame .EXIT_ON_CLOSE. Вся команда выглядит так: MyFrame. setDef aultCloseOperation (JFrame. EXIT_ON_CLOSE). В дальнейшем мы будем использовать такого типа команду достаточно часто (с поправкой на имя объекта). Наконец, для отображения окна на экране используем команду MyFrame. setvisible (true).
