- •Особенности языка Java
- •История Java
- •Характерные особенности Java
- •Разработка и выполнение Java приложения:
- •Понятие среды выполнения Java
- •Переносимость языка Java
- •Высокая производительность языка Java
- •Типы Java-приложений
- •Автономное (самостоятельное) приложение – application
- •Апплет – applet
- •Комбинированное приложение
- •Сервлет – servlet
- •Мидлет – midlet
- •Различия между автономными приложениями и апплетами
- •Автономное приложение
- •Апплет
- •Этапы жизненного цикла апплета
- •Этапы жизненного цикла в соответствии со стандартом Sun:
- •Этап инициализации
- •Этап запуска
- •Этап останова
- •Этап уничтожения
- •Этап рисования (перерисовки) окна апплета
- •Отличия Java от C++
- •Конструкторы классов
- •«Сборщик мусора»
- •Типы данных в Java
- •Простые типы
- •Ссылочные (объектные) типы
- •Строки в Java
- •Массивы в Java
- •Классы в Java
- •Особенности реализации
- •Пакеты
- •Управление доступом к элементам класса
- •Поля класса
- •Методы
- •Перегрузка и переопределение методов
- •Ключевые слова THIS и SUPER
- •Интерфейсы в Java
- •Понятие Java API
- •Пакеты ядра Java API (в JDK 1.0):
- •Развитие ядра Java API (в новой версии JDK и в Java 2)
- •Основные понятия AWT
- •Компоненты
- •Контейнеры
- •Компоновки. Менеджеры компоновки
- •События
- •События. Обработка событий
- •Иерархия классов-событий
- •Семантические события и их источники-компоненты AWT
- •Модель делегирования событий
- •Методы, объявленные в интерфейсах для семантических событий
- •Способы реализации блока прослушивания событий от AWT-компонента
- •Понятие класса-адаптера
- •Комбинированное приложение Java. Обработка события WindowEvent
- •Исключения в Java и их обработка
- •Иерархия классов исключений
- •Различия между исключениями Exception и ошибками Error
- •Организация обработки исключений в программе
- •Используемые операторы:
- •Как правильно организовывать обработку исключений
- •Понятия процесса и потока
- •Конструкторы класса Thread
- •Наиболее важные методы класса Thread
- •Способы создания потоков
- •Синхронизация потоков
- •Когда следует использовать синхронизацию потоков?
- •Механизм блокировки объекта
- •Способы использования ключевого слова synchronized
- •Синхронизированные методы
- •Оператор synchronized
- •Преимущества оператора synchronized:
- •Взаимодействие потоков: использование методов wait(), notify(), notifyAll()
- •Стандартные образцы кода использования методов
- •Поток-диспетчер событий AWT
- •Потоки и исключения
- •О группах потоков
- •Технология компонентного программирования JavaBeans
- •Понятие технологии компонентного программирования
- •Этап компиляции
- •Этап разработки
- •Этап создания приложения
- •Этап выполнения
- •Понятие компонентной модели
- •Основные требования к классам Bean-компонентов
- •Соглашения об именах
- •Соглашения об именах для свойств
- •Соглашения об именах для событий
- •Соглашения об именах для методов
- •Использование событий для управления свойствами
- •Связанные свойства
- •Преобразование обычного свойства в связанное
- •Ограниченные свойства
- •Преобразование обычного свойства в ограниченное
- •Ввод-вывод в Java: основные понятия
- •Основные группы классов и интерфейсов пакета java.io
- •Фильтрованные потоки
- •Буферизированные потоки
- •Принципы работы Buffered-потоков
- •Входные потоки
- •Выходные потоки
- •Канальные потоки
- •Синхронизация потоков данных
- •Понятие отражения (рефлексии)
- •Класс java.lang.Class
- •Классы пакета java.lang.reflect
- •Понятие интроспекции
- •Понятие сериализации
- •Обеспечение сериализуемости Bean
- •Выполнение базовой сериализации
- •Пример с сериализацией (см. SerializationDemo.java)
- •Настройка сериализации
- •Методы readObject и writeObject
- •Интерфейс Externalizable
- •Создание экземпляров сериализованных Bean
- •Приложение
- •// Файл HelloApplet.java
- •// Файл MyApplet.java
- •// Файл StringDemo.java
- •// Файл ConstrDemo.java
- •// Фрагменты файла AnimBallsPlus.java
Скачано с сайта http://ivc.clan.su
Object getltem() — возвращает элемент (item), затронутый событием;
int getStateChange() — возвращает тип изменения состояния (selected/deselected).
Способы реализации блока прослушивания событий от AWT-компонента
1. Класс, заинтересованный в обработке события (например, основной класс апплета, производный от класса Applet), реализует соответствующий интерфейс блока прослушивания (т.е. в объявлении класса содержится implements xxxListener, а в теле класса определяет(ют)ся метод(ы), объявленные в интерфейсе).
Объект, создаваемый как экземпляр данного класса (например, апплет), регистрируется в качестве блока прослушивания события от компонента:
Имя_компонента.addxxxListener(xxxListener listener)
где listener — ссылка на объект, реализующий интерфейс.
В примере PanDraw1.java в качестве listener используется this, т.е. ссылка на текущий объект класса апплета. В классе апплета и регистрируются блоки прослушивания событий для AWT-компонентов, и реализуются соответствующие интерфейсы блоков прослушивания.
Когда в результате действий пользователя генерируется событие, вызывается реализованный в классе метод блока прослушивания и ему передается объект-событие.
При использовании данного способа реализации блоков прослушивания, если предусмотрена обработка событий от нескольких однотипных компонентов (например, командных кнопок), необходимо в методе блока прослушивания (например, в actionPerformed(ActionEvent e) сначала
выяснить, от какого именно компонента передано событие (см. пример PanDraw1.java).
2. При регистрации блока прослушивания события от некоторого компонента, т.е. при вызове метода addxxxListener, создается новый объект блока прослушивания — экземпляр анонимного внутреннего класса, реализующего интерфейс xxxListener, и его метод определяется непосредственно внутри вызова метода addxxxListener:
имя_компонента.addxxxListener(new xxxListener()
{
public void имя_метода(xxxEvent e)
{
//тело метода
}
}
);
Синтаксис new xxxListener(){} указывает компилятору, что код в блоке {} определяет анонимный внутренний класс. В результате компиляции будет получен файл класса с именем
имя_внешнего_класса$№.class.
Применение данного способа реализации блоков прослушивания событий предполагает, что для используемых в приложении компонентов создаются «персональные» блоки прослушивания (см.
пример PanDraw2.java).
Низкоуровневые события
на примере событий от мыши MouseEvent
События от мыши типа MouseEvent генерируются в результате выполнения следующих действий с компонентом графического интерфейса:
события от мыши
◦кнопка мыши нажата (is pressed)
◦кнопка мыши отпущена (is released)
◦кнопка мыши нажата и отпущена, т.е. произведен щелчок по кнопке мыши (button is clicked)
◦курсор мыши входит в область изображения компонента (cursor enters a component)
◦курсор мыши покидает область изображения компонента (cursor exits a component)
23
Скачано с сайта http://ivc.clan.su
события движения мыши
◦курсор мыши перемещается в области изображения компонента (is moved)
◦курсор перемещается в области компонента при нажатой кнопке (is dragged)
В пакете java.awt.event имеется два интерфейса блоков прослушивания событий от мыши:
MouseListener
MouseMotionListener
Методы, объявленные в интерфейсах, соответствуют перечисленным выше разновидностям событий от мыши:
MouseListener
public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) public void mouseClicked(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e)
MouseMotionListener
public void mouseMoved(MouseEvent e) public void mouseDragged(MouseEvent e)
Пример использования интерфейсов блоков прослушивания для обработки событий от мыши — см. файл MouseTrack.java.
Понятие класса-адаптера
Некоторым интерфейсам блоков прослушивания событий xxxListener (точнее, интерфейсам, в которых имеется более одного метода) соответствуют открытые абстрактные классы-адаптеры xxxAdapter, содержащие пустые реализации методов интерфейса для приема и обработки событий.
Фактически адаптерами снабжены только интерфейсы блоков прослушивания низкоуровневых событий.
Классы-адаптеры в ряде случаев позволяют упростить создание блоков прослушивания событий. Если приложение должно отреагировать только на некоторые события, предусмотренные интерфейсом xxxListener, целесообразно определять новый класс, действующий как блок прослушивания, расширяя соответствующий класс-адаптер и реализуя только нужные для обработки интересующих событий методы.
Полезно использовать класс, расширяющий нужный адаптер, как внутренний класс, причем для упрощения программирования целесообразно определять внутренние классы-адаптеры как анонимные внутренние классы.
Внутренний класс имеет доступ ко всем полям и методам своего внешнего класса (в том числе и private) как к собственным.
Элементы внутреннего класса, напротив, известны только в пределах этого класса и не могут использоваться внешним классом непосредственно.
Пример использования анонимного внутреннего класса-адаптера для обработки событий от мыши — см. файл AppletGraffitty.java.
Комбинированное приложение Java. Обработка события WindowEvent
Особенности организации комбинированного приложения (на примере CombiApplet.java):
1. Основной (public) класс CombiApplet создаётся на основе класса Applet. В классе комбинированного приложения, помимо методов жизненного цикла апплета, должен быть определён метод main(). Если приложение запускается как апплет, метод main() не получает управление. Если
24