Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кпп.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
238.24 Кб
Скачать

Внутреннее устройство системы обработки событий 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();