Для работы с библиотекой awt ее необходимо подключить. По аналогии с оператором include в языке c++ используется оператор import:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.applet. *;
Стандартным образом создаем проект. В нем нам не понадобится метод main:
public class awt_example extends Applet {
public void init() {
Спроектируем наше приложение следующим образом. Основным контейнером будет frame размером 800 на 800 точек:
final Frame f = new Frame("Demo Frame");
f.setSize(800, 800);
Контейнер будет содержать большое текстовое поле и строку меню:
MenuBar mbar = new MenuBar();
f.setMenuBar(mbar);
final TextArea text = new TextArea("Enter text", 80, 40);
f.add("Center", text);
Попробуем создать строку меню «File», добавить пункт «New» и обработать событие щелчка по этому пункту. Реакцией на щелчок будет очистка текстового поля. Класс, описывающий меню, называется Menu. Соответственно, пункт меню – MenuItem. У каждого класса, входящего в библиотеку awt, есть пустой конструктор по умолчанию. Кроме того, как правило, есть конструктор с единственным аргументом типа String, описывающим «маркировку» элемента на форме. Разумнее создавать элемент при помощи одного из этих двух конструкторов, а затем задавать свойства элемента при помощи метода, название которого начинается со слова Set.
Механизм обработки события в Java довольно сложен. Модель обработки событий Java 1.1 используется как в пакете AWT, так и в JavaBeans API. В этой модели разным типам событий соответствуют различные классы Java. Каждое событие является подклассом класса java.util.EventObject. События пакета AWT, которые и рассматриваются в данной главе, являются подклассом java.awt.AWTEvent. Для удобства события различных типов пакета AWT (например, MouseEvent или АсtionEvent) помещены в новый пакет java.awt.event.
Для каждого события существует порождающий его объект, который можно получить с помощью метода getSource(), и каждому событию пакета AWT соответствует определенный идентификатор, который позволяет получить метод getid(). Это значение используется для того, чтобы отличать события различных типов, которые могут описываться одним и тем же классом событий. Например, для класса FocusEvent возможны два типа событий: FocusEvent.FOCUS_GAINED и FocusEvent.FOCUS_LOST. Подклассы событий содержат информацию, связанную с данным типом события. Например, в классе MouseEvent существуют методы getX(), getY() и getClickCount (). Этот класс наследует, в числе прочих, и методы getModifiers() и getWhen().
Модель обработки событий Java 1.1 базируется на концепции слушателя событий (Listener). Слушателем события является объект, заинтересованный в получении данного события. В объекте, который порождает событие (в источнике событий), содержится список слушателей, заинтересованных в получении уведомления о том, что данное событие произошло, а также методы, которые позволяют слушателям добавлять или удалять себя из этого списка. Когда источник порождает событие (или когда объект источника зарегистрирует событие, связанное с вводом информации пользователем), он оповещает все объекты слушателей событий о том, что данное событие произошло.
Источник события оповещает объект слушателя путем вызова специального метода и передачи ему объекта события (экземпляра подкласса EventObject). Для того чтобы источник мог вызвать данный метод, он должен быть реализован для каждого слушателя. Это объясняется тем, что все слушатели событий определенного типа должны реализовывать соответствующий интерфейс. Например, объекты слушателей событий ActionEvent должны реализовывать интерфейс ActionListener. В пакете Java.awt.event определены интерфейсы слушателей для каждого из определенных в нем типов событий (например, для событий MouseEvent здесь определено два интерфейса слушателей: MouseListener и MouseMotionListener). Все интерфейсы слушателей событий являются расширениями интерфейса java.util.EventListener. В этом интерфейсе не определяется ни один из методов, но он играет роль интерфейса-метки, в котором однозначно определены все слушатели событий как таковые.
В интерфейсе слушателя событий может определяться несколько методов. Например, класс событий, подобный MouseEvent, описывает несколько событий, связанных с мышью, таких как события нажатия и отпускания кнопки мыши. Эти события вызывают различные методы соответствующего слушателя. По установленному соглашению, методам слушателей событий может быть передан один единственный аргумент, являющийся объектом того события, которое соответствует данному слушателю. В этом объекте должна содержаться вся информация, необходимая программе для формирования реакции на данное событие.
Добавим в меню пункты открытия файла и закрытия приложения:
В работе необходимо самостоятельно реализовать пункты копирования и вставки текста в меню. Для этого необходимо самостоятельно изучить методы GetSelectedText и InsertText класса TextArea.
Весь код программы целиком:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.applet. *;
public class awt_example extends Applet {
public void init() {
final Frame f = new Frame("Demo Frame");
f.setSize(800, 800);
MenuBar mbar = new MenuBar();
f.setMenuBar(mbar);
final TextArea text = new TextArea("Enter text", 80, 40);
Внешний вид приложения приведен на рис.3. В качестве альтернативного варианта предлагается код формы, содержащий текстовое окно, а также кнопки (рис.5):
Кроме того, необходимо самостоятельно реализовать открытие файла с помощью диалога открытия и выбора файла. Класс диалога находится в библиотеке swing. Для обращения к ней необходимо импортировать классы в начале описания: import javax.swing.*. Пример открытия файла через диалог, а также описание класса фильтра для данного диалога приведены ниже, внешний вид диалога – на рис.6:
JFileChooser fc = new JFileChooser();
ExtFileFilter ff1 = new ExtFileFilter("txt", "*.txt — текстовые файлы");
class ExtFileFilter extends javax.swing.filechooser.FileFilter {
String ext;
String description;
ExtFileFilter(String ext, String descr) {
this.ext = ext;
description = descr;
}
public boolean accept(File f) {
if(f != null) {
if(f.isDirectory()) {
return true;
}
String extension = getExtension(f);
if( extension == null )
return (ext.length() == 0);
return ext.equals(extension);
}
return false;
}
public String getExtension(File f) {
if(f != null) {
String filename = f.getName();
int i = filename.lastIndexOf('.');
if(i>0 && i<filename.length()-1) {
return filename.substring(i+1).toLowerCase();
};
}
return null;
}
public String getDescription() {
return description;
}
}
Рис.6. Диалог открытия файла
Вопросы/задания к лабораторной работе:
1. Что такое апплет?
2. Как можно запускать апплеты?
3. Каков порядок вызова методов при запуске апплета?
4. Как задать цвет какого-либо компонента?
5. Как определить нужный шрифт, а затем применить его к какому-либо компоненту?
6. Как обрабатываются события пользователя?
7. Что такое контейнер?
8. Как размещаются элементы в контейнере?
9. Самостоятельно реализовать пункты «Copy» и «Paste».
10. Самостоятельно реализовать сохранение введенного текста в текстовый файл (путь к файлу произвольный).
11. Самостоятельно реализовать открытие текстового файла с диска, используя ДИАЛОГ открытия файла из библиотеки классов swing.
12. Самостоятельно изучить объект Button (кнопка): его свойства, методы, события.
13. Самостоятельно изучить объект Font (шрифт): свойства и работу со шрифтом
14. Самостоятельно изучить объект Layout, управляющий размещением компонентов в контейнере.
На защиту лабораторной работы выносятся все вышеозначенные вопросы, а также принципы размещения компонентов на форме. Вопрос может быть сформулирован следующим образом: создайте приложение определенного вида.