- •Краткая историческая справка.
- •Преимущества языка Java.
- •Недостатки java:
- •Лекция 2. Этапы разработки java-приложений. Этапы разработки java-приложений.
- •Установка jdk.
- •Инсталляция исходных кодов библиотек
- •Инсталляция пакета документации.
- •Тестирование правильности установки и создание простейшей программы
- •Визуальные среды программирования.
- •Лекция 3. Переменные и типы данных. Переменные и типы данных.
- •Подробности о примитивных типах.
- •Лекция 4. Операторы и функции. Операторы и функции.
- •Операторы ветвлений и циклов.
- •Оператор цикла while.
- •Оператор цикла for.
- •Лекция 5. Объектно ориентированное программирование Объектно ориентированное программирование.
- •Определение объекта.
- •Инкапсуляция.
- •Наследование.
- •Полиморфизм (перегрузка).
- •Пример ооп – программы.
- •Отличие перегрузки функций от переопределения.
- •Отличие классов от интерфейсов.
- •Лекция 6. Массивы и строки. Массивы и строки.
- •Многомерные массивы.
- •Приведение типов и динамические массивы.
- •Строки в java.
- •Лекция 7. Организация ввода-вывода данных Организация ввода-вывода данных.
- •Функции стандартной библиотеки ввода/вывода.
- •Новая библиотека ввода/вывода.
- •Классы потокового ввода/вывода из пакета java.Io.
- •Лекция 8. Обработка исключений. Обработка исключений.
- •Классификация исключений.
- •Перехват исключений блоками try/catch.
- •Самостоятельное выбрасывание исключений.
- •Разработка собственных классов исключений.
- •Лекция 9. Потоки. Потоки.
- •1. Cпециальный класс Thread.
- •2. Реализация интерфейса Runnable.
- •Выбор между использованием класса Thread и интерфейса Runnable.
- •Синхронизация потоков с помощью оператора synchronized.
- •Синхронизация потоков с помощью семафоров.
- •Лекция 10. Подключаемые библиотеки java. Подключаемые библиотеки java.
- •Библиотека awt
- •Внутреннее устройство системы обработки событий awt.
- •Библиотека Swing.
Внутреннее устройство системы обработки событий awt.
Во главе иерархии обработчиков находится класс AWTEvent. Он наследуется непосредственно от класса Object и физически расположен в пакете java.util.
Все остальные нижележащие классы, показанные на рисунке, располагаются в пакете java.awt.event.
Для каждого указанного на схеме класса событий есть соответствующий интерфейс, название которого составляется из названия соответствующего классу события + слово Listener. Например, ActionListener, MouseListener, KeyListener… и т.д.
Методы интерфейса прослушивают соответствующие события, возникающие в компоненте и в случае возникновения такого события, автоматически выполняются, получая на вход в качестве аргумента объект-событие, содержащий всю необходимую для обработки информацию. Таким образом, программисту для организации в своем приложении обработки событий, достаточно реализовать интерфейс тех событий, которые он собирается обрабатывать. То есть написать соответствующий объект-обработчик событий и подключить его к тем компонентам, события от которых он собирается обрабатывать.
Класс может реализовывать сразу несколько интерфейсов, поэтому в одном классе можно в принципе собрать все события приложения, которые необходимо обработать.
Сейчас в следующем тестовом примере мы именно так и поступим:
import java.awt.*;
import java.awt.event.*;
class MyListener implements ActionListener, ItemListener {
TextField mytf;
Choice mych;
MyListener(TextField tf, Choice ch) { this.mytf = tf; this.mych = ch; }
@Override
public void actionPerformed(ActionEvent e) { // нажатие кнопки.
Frame fr = new MyWindow();
}
@Override
public void itemStateChanged(ItemEvent e) { // выбор пункта из выпадающего списка.
mytf.setText(mych.getItem(mych.getSelectedIndex()));
}
}
class MyWindow extends Frame {
public MyWindow () {
setLayout(null);
setSize(450, 550);
setVisible(true);
Choice ch = new Choice();
ch.add("1 пункт");
ch.add("2 пункт");
ch.setBounds(10, 50, 100, 20); add(ch);
Label l1 = new Label("Название поля", Label.RIGHT);
l1.setBounds(200, 30, 100, 15); add(l1);
TextField tf = new TextField(30);
tf.setBounds(200, 50, 160, 22); add(tf);
Button b1 = new Button("OK!");
b1.setBounds(10, 100, 160, 30); add(b1);
b1.addActionListener(new MyListener(tf, ch));
ch.addItemListener(new MyListener(tf, ch));
addWindowListener(new WindowAdapter () {
public void windowClosing(WindowEvent ev) { ev.getWindow().dispose(); }
});
}
}
public class Gip {
public static void main(String[] args) {
Frame fr = new MyWindow();
}
}
В данном примере создано небольшое тестовое приложение из одного окна и нескольких элементов управления: выпадающий список, кнопка и поле ввода с меткой.
Процес добавления элементов управления на форму совсем не сложный. Достаточно создать соответствующий класс, настроить его параметры и затем разместить на форме методом add(экземпляр_класса_элемента_управления). Обратите внимание, что в AWT размещением элементов на форме заведует специальный компоновщик. Мы вызвали его, обратившись к функции setLayout(null). Без компоновщика элементы на форме будут располагаться хаотично. Обычно в классах элементов управления задается масса параметров – размеры элемента, расположение, цвета и картинка рамки и фона, параметры шрифтов и т.д. Все это выходит за рамки данной лекции, кроме того это легко найти в документации, поэтому здесь мы ограничимся настройкой расположения и размеров по принципу b1.setBounds(зазор_слева, зазор_сверху, длинна_эл, высота_элем).
Кроме того мы написали класс MyListener, реализующий интерфейсы обработчиков событий ActionListener и ItemListener.
Экземпляр этого класса мы подключили к элементам управления, события от которых мы собираемся обрабатывать:
…
b1.addActionListener(new MyListener(tf, ch));
ch.addItemListener(new MyListener(tf, ch));
…
Чтобы манипулировать данными компонентов, мы передали в конструктор листенера соответствующие ссылки. Внутри объект листенера тоже устроен довольно просто.
Внутри интерфейсов есть единственный метод, который перехватывает все события.
Для реализации интерфейса достаточно переопределить его. Так как у нас два различных интерфейса для двух разных элементов управления, то мы переопределяем методы для каждого из них.
…
@Override
public void actionPerformed(ActionEvent e) { // нажатие кнопки.
Frame fr = new MyWindow();
}
@Override
public void itemStateChanged(ItemEvent e) { // выбор пункта из выпадающего списка.
mytf.setText(mych.getItem(mych.getSelectedIndex()));
…
По событию нажатия кнопки мы создаем копию главного окна приложения (имитируем открытие дочернего окна в многооконном интерфейсе). Понятное дело, что можно точно так же создать другой класс окна и заполнить его элементами управления с другой логикой, но здесь в лекции нам этим заниматься не нужно, достаточно просто обозначить возможность. По событию выбора нового элемента списка мы получаем из элемента выбранный пункт и переносим его название в текстовое поле ввода:
…
mytf.setText(mych.getItem(mych.getSelectedIndex()));
…
Вначале получаем индекс выбранного элемента, затем получаем содержимое по индексу и отправляем все это в текстовый элемент с помощью метода mytf.setText().
В заключение мы немного отредактируем функцию обработки событий всего окна в классе главного окна:
…
addWindowListener(new WindowAdapter () {
public void windowClosing(WindowEvent ev) { ev.getWindow().dispose(); }
});
…
Так как теперь есть возможность создавать дочерние окна, то вызов функции закрытия всего приложения уже не годиться. Достаточно закрыть только текущее окно.
Поэтому мы из объекта события получаем ссылку на текущее окно и закрываем только его:
…
ev.getWindow().dispose();
