|
||||||||||||
|
||||||||||||
|
|||||||||
МЕНЮ
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА - РЕФЕРАТЫ - Программирование графики и обработка событийПрограммирование графики и обработка событий3 Факультет "Информатика и системы управления" Методические указания к лабораторной работе по курсу "Распределенные системы обработки информации" Программирование графики и обработка событий Москва 2004 г. Оглавление
На рис. 1 показана иерархия основных классов AWT. Основу ее составляют готовые компоненты: Button, Canvas, Checkbox, Choice, Container, Label, List, Scrollbar, TextArea, TextField, Menubar, Menu, PopupMenu, Menultem, CheckboxMenuItem. Если этого набора не хватает, то от класса Canvas можно породить собственные "тяжелые" компоненты, а от класса Component -- "легкие" компоненты. Основные контейнеры -- это классы Panel, ScrollPane, Window, Frame, Dialog, FileDialog. Свои "тяжелые" контейнеры можно породить от класса Panel, а "легкие" -- от класса Сontainer. На рис. 1 также показаны и начальные классы иерархии библиотеки Swing -- классы JComponent, JWindow, JFrame, JDialog, JApplet. Рис. 1 Иерархия основных классов AWT Приложение 3. Основные компонентыКомпонент LabelКомпонент Label -- это просто строка текста, оформленная как графический компонент для размещения в контейнере. Текст можно поменять только методом доступа setText(string text), но не вводом пользователя с клавиатуры или с помощью мыши. Создается объект этого класса одним из трех конструкторов: · Label () -- пустой объект без текста; · Label (string text) -- объект с текстом text, который прижимается клевому краю компонента; · Label (String text, int alignment) -- объект с текстом text и определенным размещением в компоненте текста, задаваемого одной из трех констант: CENTER, LEFT, RIGHT. Размещение можно изменить методом доступа setAlignment(int alignment). Остальные методы позволяют получить текст getText() и размещение getAlignment (). СобытияВ классе Label происходят события классов Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent. Компонент ButtonКомпонент Button -- это кнопка стандартного для данной графической системы вида с надписью, умеющая реагировать на щелчок кнопки мыши -- при нажатии она "вдавливается" в плоскость контейнера, при отпускании -- становится "выпуклой". Два конструктора Button () и Button (String label) создают кнопку без надписи и с надписью label соответственно. Методы доступа getLabel() и setLabel (String label) позволяют получить и изменить надпись на кнопке. Главная функция кнопки -- реагировать на щелчки мыши, и прочие методы класса обрабатывают эти действия. СобытияКроме событий класса Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при воздействии на кнопку происходит событие ActionEvent. Компонент CheckboxКомпонент Checkbox -- это надпись справа от небольшого квадратика, в котором в некоторых графических системах появляется галочка после щелчка кнопкой мыши -- компонент переходит в состояние on. После следующего щелчка галочка пропадает -- это состояние off. В других графических системах состояние on отмечается "вдавливанием" квадратика. В компоненте Checkbox состояния on/off отмечаются логическими значениями true/false соответственно. Три конструктора Checkbox (), Checkbox (String label), Checkbox (String label, boolean state) создают компонент без надписи, с надписью label в состоянии off, и в заданном состоянии state. Методы доступа getLabel(), setLabel (String label), getState(), setState (boolean state) возвращают и изменяют эти параметры компонента. СобытияВ классе Checkbox происходят события класса Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, а при изменении состояния кнопки возникает событие ItemEvent. В библиотеке AWT радиокнопки не образуют отдельный компонент. Вместо этого несколько компонентов Checkbox объединяются в группу с помощью объекта класса CheckboxGroup. Класс CheckboxGroupКласс CheckboxGroup очень мал, поскольку его задача -- просто дать общее имя всем объектам Checkbox, образующим одну группу. В него входит один конструктор по умолчанию CheckboxGroup() и два метода доступа: · getSelectedCheckbox(), возвращающий выбранный объект Checkbox; · setSelectedCheckbox (Checkbox box), задающий выбор. Как создать группу радиокнопокЧтобы организовать группу радиокнопок, надо сначала сформировать объект класса CheckboxGroup, а затем создавать кнопки конструкторами Checkbox(String label, CheckboxGroup group, boolean state) Checkbox(String label, boolean state, CheckboxGroup group) Эти конструкторы идентичны, просто при записи конструктора можно не думать о порядке следования его аргументов. Только одна радиокнопка в группе может иметь состояние state = true. Компонент ChoiceКомпонент Сhoice -- это раскрывающийся список, один, выбранный, пункт (item) которого виден в поле, а другие появляются при щелчке кнопкой мыши на небольшой кнопке справа от поля компонента. Вначале конструктором Choice() создается пустой список. Затем, методом add (String text), в список добавляются новые пункты с текстом text. Они располагаются в порядке написания методов add() и нумеруются от нуля. Вставить новый пункт в нужное место можно методом insert (string text, int position). Выбор пункта можно произвести из программы методом select (String text) или select(int position). Удалить один пункт из списка можно методом remove (String text) или remove (int position), а все пункты сразу -- методом removeAll(). Число пунктов в списке можно узнать методом getItemCount (). Выяснить, какой пункт находится в позиции pos можно методом getItem(int pos), возвращающим строку. Наконец, определение выбранного пункта производится методом getSelectedIndex(), возвращающим позицию этого пункта, или методом getSelectedItem(), возвращающим выделенную строку. СобытияВ классе Choice происходят события класса Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, а при выборе пункта возникает событие ItemEvent. Если надо показать на экране несколько пунктов списка, то в этом случае используется объект класса List. Компонент TextFieldКомпонент TextField -- это поле для ввода одной строки текста. Ширина поля измеряется в колонках (column). Ширина колонки -- это средняя ширина символа в шрифте, которым вводится текст. Нажатие клавиши <Enter> заканчивает ввод и служит сигналом к началу обработки введенного текста, т. е. при этом происходит событие ActionEvent. В классе четыре конструктора: · TextField() -- создает пустое поле шириной в одну колонку; · TextField(int columns) -- создает пустое поле с числом колонок columns; · TextField(String text) -- создает поле с текстом text; · TextField(String text, int columns) -- создает поле с текстом text и числом колонок columns. Интересная разновидность поля ввода -- поле для ввода пароля. В таком поле вместо вводимых символов появляется какой-нибудь особый эхо-символ, чаще всего звездочка, чтобы пароль никто не подсмотрел через плечо. Данное поле ввода получается выполнением метода setEchoChar(char echo). Аргумент echo -- это символ, который будет появляться в поле. Проверить, установлен ли эхо-символ, можно логическим методом echoCharisSet(), получить эхо-символ -- методом getEchoChar (). Чтобы вернуть поле ввода в обычное состояние, достаточно выполнить метод setEchoChar(0). СобытияКроме событий класса Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при изменении текста пользователем происходит событие TextEvent, а при нажатии на клавишу <Enter> -- событие ActionEvent. Контейнер FramеКонтейнер Frame -- это полноценное готовое окно со строкой заголовка, в которую помещены кнопки контекстного меню, сворачивания окна в ярлык и разворачивания во весь экран и кнопка закрытия приложения. Заголовок окна записывается в конструкторе или методом setTitle(String title). На кнопке контекстного меню в левой части строки заголовка изображена дымящаяся чашечка кофе -- логотип Java. Вы можете установить там другое изображение методом setIconImage(image icon), создав предварительно изображение icon в виде объекта класса image. Все элементы окна Frame вычерчиваются графической оболочкой операционной системы по правилам этой оболочки. Окно Frame автоматически регистрируется в оконном менеджере графической оболочки и может перемещаться, менять размеры, сворачиваться в панель задач (task bar) с помощью мыши или клавиатуры, как "родное" окно операционной системы. Создать окно типа Frame можно следующими конструкторами: · Frame () -- создает окно с пустой строкой заголовка; · Frame (String title) -- записывает аргумент title в строку заголовка. Методы класса Frame осуществляют доступ к элементам окна, но также класс Frame наследует около двухсот методов классов Component, Container и Window. В частности, наследуется менеджер размещения по умолчанию -- BorderLayout. СобытияКроме событий класса Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при изменении размеров окна, его перемещении или удалении с экрана, а также показа на экране происходит событие windowEvent. Приложение 4. Менеджеры размещения.Для того чтобы размещение компонентов в окне не нарушалось при движении, переносе и т.д. используются менеджеры размещения или компоновки (layout managers), называемые иногда просто компоновщиками. Программист может воспользоваться стандартными менеджерами размещения или написать свои собственные, реализовав интерфейсы LayoutManager или LayoutManager2. К стандартным менеджерам размещения относятся:
Менеджеры размещения могут быть скомбинированы друг с другом. По умолчанию в панелях и аплетах используется менеджер размещения FlowLayout, а в окнах и диалоговых окнах - BorderLayout. Установка менеджера размещения для текущего контейнера осуществляется при помощи вызова: контейнер.setLayout(new конструкторМенеджераРазмещения(параметры)) Менеджер абсолютного размещения Объявление того, что контейнер имеет менеджер размещения с абсолютным позиционированием компонентов, имеет вид:контейнер.setLayout(null) Установка границ каждого компонента осуществляется при помощи метода: компонент.setSize(координатаХ, координатаY, ширина, высота) Компонент добавляется в контейнер при помощи метода: контейнер.add(компонент) Приведем пример использования менеджера размещения компонентов с абсолютным позиционированием. Пример.1. Демонстрация использования менеджера размещения компонентов с абсолютным позиционированием import java.awt.*; public class Absolute extends Frame{ Button b1 = new Button("Cancel"),// Создадим две кнопки b2 = new Button("OK" ); public void Absolute() { setBackground(Color.lightGray); // Установим светло-серый фон setLayout(null);// Установим для окна менеджер абсолютного расположения // Установим границы (расположение и размеры) для каждой кнопки b1.setBounds( 50, 70, 50, 24); b2.setBounds(110, 70, 50, 24); // Добавим обе кнопки в окно add(b1); add(b2); } } Менеджер FlowLayoutНаиболее просто поступает менеджер размещения FlowLayout. Он укладывает в контейнер один компонент за другим слева направо как кирпичи, переходя от верхних рядов к нижним. При изменении размера контейнера "кирпичи" перестраиваются. Компоненты поступают в том порядке, в каком они заданы в методах add(). В каждом ряду компоненты могут прижиматься к левому краю, если в конструкторе аргумент align равен FlowLayout.LEFT, к правому краю, если этот аргумент FlowLayout.RIGHT, или собираться в середине ряда, если FlowLayout.CENTER. Между компонентами можно оставить промежутки (gap) по горизонтали hgap и вертикали vgap. Это задается в конструкторе: FlowLayout(int align, int hgap, int vgap) Второй конструктор задает промежутки размером 5 пикселов: FlowLayout(int align) Третий конструктор определяет выравнивание по центру и промежутки 5 пикселов: FlowLayout() После формирования объекта эти параметры можно изменить методами: setHgap(int hgap) setVgap(int vgap) setAlignment(int align) Менеджер BorderLayoutМенеджер размещения BorderLayout делит контейнер на пять неравных областей, полностью заполняя каждую область одним компонентом. Области получили географические названия NORTH, SOUTH, WEST, EAST и CENTER. Метод add() в случае применения BorderLayout имеет два аргумента: ссылку на компонент comp и область region, в которую помещается компонент -- одну из перечисленных выше констант: add(Component comp, String region) Обычный метод add (Component comp) с одним аргументом помещает компонент в область CENTER. В классе два конструктора: · BorderLayout () -- между областями нет промежутков; · BorderLayout(int hgap int vgap) -- между областями остаются горизонтальные hgap и вертикальные vgap промежутки, задаваемые в пикселах. Если в контейнер помещается менее пяти компонентов, то некоторые области не используются и не занимают места в контейнере. Если не занята область CENTER, то компоненты прижимаются к границам контейнера. Рис. 2. Области размещения BorderLayout Менеджер размещения BorderLayout кажется неудобным: он располагает не больше пяти компонентов, последние растекаются по всей области, области имеют странный вид. Но дело в том, что в каждую область можно поместить не компонент, а панель, и размещать компоненты на ней. Менеджер GridLayoutМенеджер размещения GridLayout расставляет компоненты в таблицу с заданным в конструкторе числом строк rows и столбцов columns: GridLayout(int rows, int columns) Все компоненты получают одинаковый размер. Промежутков между компонентами нет. Второй конструктор позволяет задать промежутки между компонентами в пикселах по горизонтали hgap и вертикали vgap: GridLayout(int rows, int columns, int hgap, int vgap) Конструктор по умолчанию GridLayout() задает таблицу размером 0x0 без промежутков между компонентами. Компоненты будут располагаться в одной строке. Компоненты размещаются менеджером GridLayout слева направо по строкам созданной таблицы в том порядке, в котором они заданы в методах add(). Нулевое количество строк или столбцов означает, что менеджер сам создаст нужное их число. Рис. 3. Пример размещения кнопок менеджером GridLayout Менеджер CardLayoutМенеджер размещения CardLayout своеобразен -- он показывает в контейнере только один, первый (first), компонент. Остальные компоненты лежат под первым в определенном порядке как игральные карты в колоде. Их расположение определяется порядком, в котором написаны методы add(). Следующий компонент можно показать методом next(Container с), предыдущий -- методом previous(Container с), Последний -- методом last(Container с), первый -- методом first(Container с). Аргумент этих методов -- ссылка на контейнер, в который помещены компоненты, обычно this. В классе два конструктора: · СardLayout() -- не отделяет компонент от границ контейнера; · CardLayout(int hgap, int vgap) -- задает горизонтальные hgap и вертикальные vgap поля. Менеджер CardLayout позволяет организовать и произвольный доступ к компонентам. Метод add() для менеджера CardLayout имеет своеобразный вид: add(Component comp, Object constraints) Здесь аргумент constraints должен иметь тип String и содержать имя компонента. Нужный компонент с именем name можно показать методом: show(Container parent, String name) Рис. 4. Пример менеджера размещения CardLayout Менеджер GridBagLayoutМенеджер размещения GridBagLayout расставляет компоненты наиболее гибко, позволяя задавать размеры и положение каждого компонента. Но он оказался очень сложным и применяется редко. В классе GridBagLayout есть только один конструктор по умолчанию, без аргументов. Менеджер класса GridBagLayout, в отличие от других менеджеров размещения, не содержит правил размещения. Он играет только организующую роль. Ему передаются ссылка на компонент и правила расположения этого компонента, а сам он помещает данный компонент по указанным правилам в контейнер. Все правила размещения компонентов задаются в объекте другого класса, GridBagConstraints. Менеджер размещает компоненты в таблице с неопределенным заранее числом строк и столбцов. Один компонент может занимать несколько ячеек этой таблицы, заполнять ячейку целиком, располагаться в ее центре, углу или прижиматься к краю ячейки. Класс GridBagConstraints содержит одиннадцать полей, определяющих размеры компонентов, их положение в контейнере и взаимное положение, и несколько констант -- значений некоторых полей. Они перечислены в табл. 1. Эти параметры определяются конструктором, имеющим одиннадцать аргументов. Второй конструктор -- конструктор по умолчанию -- присваивает параметрам значения, заданные по умолчанию. Таблица 1. Поля класса GridBagConstraints
Как правило, объект класса GridBagConstraints создается конструктором по умолчанию, затем значения нужных полей меняются простым присваиванием новых значений, например: GridBagConstraints gbc = new GridBagConstraints(); gbc.weightx = 1.0; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.gridheight =2; После создания объекта gbc класса GridBagConstraints менеджеру размещения указывается, что при помещении компонента comp в контейнер следует применять правила, занесенные в объект gbc. Для этого применяется метод add(Component comp, GridBagConstraints gbc) Итак, схема применения менеджера GridBagLayout такова: GridBagLayout gbl = new GridBagLayout(); // Создаем менеджер setLayout(gbl); // Устанавливаем его в контейнер // Задаем правила размещения по умолчанию GridBagConstraints с = new GridBagConstraints(); Button b2 = new Button(); // Создаем компонент c.gridwidth =2; // Меняем правила размещения add(bl, с); // Помещаем компонент b2 в контейнер по указанным правилам //размещения с Button b2 = new Button(); // Создаем следующий компонент c.gridwidth = 1; // Меняем правила для его размещения add(b2, с); // Помещаем в контейнер и т.д. Приложение 5. Обработка событий.Java 2 использует хорошо структурированную, функционально полную и очень логичную модель обработки событий, впервые реализованную в JDK 1.1. Иерархия классов событий имеет вид: ? Object ? EventObject ? AWTEvent ? ActionEvent ? AdjustmentEvent ? ItemEvent ? TextEvent ? ComponentEvent ? ContainerEvent ? FocusEvent ? WindowEvent ? PaintEvent ? InputEvent ? KeyEvent ? MouseEvent Классы и интерфейсы для работы с делегированными событиями расположены в пакете java.awt.event (см. рисунок 5). В классах событий существуют открытые методы:
Классы, ответственные за обработку событий в JDK 1.1, реализуют интерфейсы “прослушивания” событий (listeners):
Некоторым интерфейсам событий соответствуют открытые абстрактные классы-адаптеры, содержащие пустые методы для обработки событий:
К действиям относятся события, поступающие от компонентов:
Управляющие компоненты регистрируют “прослушивание” событий при помощи методов вида: void addТипКомпонентаListener(объектРеализующийПрослушивание) и освобождаются от “прослушивания” событий при помощи соответствующих методов вида: void removeТипКомпонентаListener(объектРеализующийПрослушивание)
Приведем пример приложения, обрабатывающего событие ActionEvent Пример работы с событием действия (ActionEvent) import java.awt.*; import java.awt.event.*; public class FrameActionEvent extends Frame implements ActionListener{ Label l = new Label();// Создадим метку для вывода сообщения Button b = new Button("OK");// Создадим кнопку, генерирующую сообщение public void FrameActionEvent() { setLayout(null);// Установим абсолютное размещение компонентов setBackground(Color.lightGray);// Установим светло-серый фон // Установим границы управляющих компонентов l.setBounds(20, 10, 40, 20); // метки b.setBounds(20, 40, 40, 20); // кнопки // Зарегистрируем для кнопки “прослушивание” событий b.addActionListener(this); // Добавим в окно add(l); // метку add(b); // кнопку } // Реализуем обработку события действия public void actionPerformed(ActionEvent e) { l.setText("I'm OK!"); } } |
РЕКЛАМА
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА | ||
© 2010 |