На заметку:
Существует и другой способ обработки событий, который не предполагает регистрации обработчиков в компонентах. Хотя в принципе это удобно, поскольку не нужно выполнять нетривиальную процедуру регистрации обработчиков, такой алгоритм обработки событий не очень эффективен. В этой схеме если происходит событие, то подходящий для него обработчик выбирается перебором всех доступных обработчиков. А на это, по крайней мере, уходит время, не считая прочих не столь очевидных неудобств.
Теперь вернемся к программному коду. Зачем командой import javax.swing.* подключается библиотека Swing, в общем-то понятно. Командой import java.awt.event.* подключается пакет event из библиотеки AWT. Этот пакет содержит утилиты для обработки событий. Несмотря на то, что мы используем библиотеку Swing для создания графического интерфейса, система обработки событий у Swing фактически та же, что и у AWT
Класс для реализации окна с меткой называется MyFrame. Но поскольку в данном случае кроме графических компонентов приходится также обрабатывать события (щелчок на кнопке), создаваемый класс еще и реализует интерфейс ActionListener. Причина к такому радикальному и непопулярному шагу следующая. Как уже анонсировалось, в окне имеется кнопочка. Для события, которое состоит в щелчке на кнопке, хорошо было бы создать обработчик. Обработчик должен содержать метод actionPerformed(), который собственно и вызывается при обработке события щелчка на кнопке. Метод actionPerformed() объявлен в интерфейсе ActionListener. Обработчик является объектом класса, который реализует этот интерфейс. Мы пошли самым простым путем - интерфейс ActionListener реализуется тем же классом, в котором описывается окно приложения. Поэтому в этом классе, кстати говоря, описывается метод actionPerformed().
Конструктор класса MyFrame принимает три аргумента: текстовая строка для отображения в метке в области окна и два целочисленных параметра, которые определяют положение на экране отображаемого окна. В конструкторе командой JFrame frm=new JFrame(" Окно с меткой и кнопкой") создается окно с заголовком " Окно с меткой и кнопкой". Положение окна на экране и размеры окна задаются командой frm.setBounds(х,у,360,200). Здесь х и у - второй и третий аргументы конструктора. Реакцию на закрытие окна с помощью системной пиктограммы задаем командой frm.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE) .
В окне, кроме метки и кнопки, будет еще и пиктограмма (как составная часть, или содержание, метки). Создаем пиктограмму командой Imagelcon icn=new Imagelcon ("d: /Books/Java_guide/pictures/javalogo.gif") на основе изображения в файле javalogo.gif. Пиктограмма создается как объект icn класса Imagelcon. После этого командой JLabel lbl=new JLabel (text, icn, JLabel. CENTER) создается метка с текстом (text — первый аргумент конструктора), пиктограммой из объекта icn и способом выравнивания содержимого метки по центру (третий аргумент конструктора класса JLabel - статическая константа JLabel. CENTER). Положение и размер пиктограммы в окне задается командой lbl.setBounds(10,10,330,100) .После этого приступаем к созданию кнопки. Создаем ее командой JButton btn=new JButton ("Принято к сведению"). Положение и размер кнопки задаем командой btn.setBounds(90,120,180,30).
Дальше - очень важная команда, на которую следует обратить внимание: btn. addActionListener(this). Из объекта кнопки btn вызывается стандартный метод addActionListener(). Этим методом в объект, из которого он вызывается (кнопка), добавляется обработчик события щелчка на кнопке. Объект обработчика указывается аргументом метода addActionListener(). К объекту обработчика применяются достаточно демократичные требования: он должен содержать описание метода actionPerformed(). Поскольку, как увидим далее, описание этого метода есть в классе MyFrame, создаваемый объект этого класса может быть обработчиком щелчка на кнопке. Именно об этом свидетельствует ссылка this на создаваемый объект в аргументе метода addActionListener().
Чтобы компоненты (кнопка и метка) отображались в окне приложения так, как мы указали, а не в автоматическом режиме, отключаем менеджер компоновки командой frm.setLayout(null). Дальше команды простые. Так, командой frm.add(lbl) добавляется метка в окно. Добавление кнопки в окно выполняется командой frm.add(btn). Отображается окно командой frm.setvisible(true). На этом код конструктора заканчивается.
Описание метода actionPerformed() из интерфейса ActionListener, имеет следующий вид:
public void actionPerformed(ActionEvent AEobj){ System.exit(0) ; }
Аргументом методу передается объект класса ActionEvent. Вообще это объект события. Другими словами, методу, который обрабатывает событие, аргументом передается объект, который описывает это событие. В принципе, вполне логично. В общем случае объект события может быть очень полезным, особенно если один обработчик используется для обработки событий в нескольких компонентах. Например, по объекту события можно определить компонент, который его вызвал. Но в данном случае аргумент метода actionPerformed() в программном коде тела этого метода не используется. Тело метода состоит всего из одной команды System.exit(O). Командой завершается работа приложения (всех потоков).
Описанием метода actionPerformed() заканчивается описание класса MyFrame. После этого в методе main() класса FrameAndButton командой new MyFrame(" Окно с меткой, пиктограммой и кнопкой ! ", 400,250) создается анонимный объект класса MyFrame, то есть окно с описанными выше параметрами.
