писанию монолитных программ, второй приводит к очень большому
числу классов.
В реальной жизни используется компромиссная идеология -
handleEvent переопределяется для составных об®ектов, об®единяю-
щих несколько элементов интерфейса и отвечающих за ясно опреде-
ленную часть работы приложения (например, разного рода диало-
ги).
Кроме того, возможны и другие модели обработки событий, направ-
ленные на лучшее отделенин логики программы от ее интерфейса. В
качестве одного из примеров реализации альтернативной модели
можно указать пакет "The Command Class for AWT objects", кото-
рый написал Jan Newmarch, jan@ise.canberra.edu.au.
4.3.5. Методы класса Component, связанные с обработкой событий
Ниже перечислены методы класса Component, связанные с обработ-
кой событий.
- postEvent(). Этот метод, как правило, вызывается автоматичес-
ки при наступлении соответствующего события.
- Обрабатываются события при помощи метода handleEvent(). По
умолчанию этот метод, в зависимости от типа события, вызывает
один из специализированных обработчиков событий, таких как
- - action()
- - keyUp()
- - mouseDown()
- - gotFocus()
и т.д.
Метод handleEvent() может быть переопределен. В этом случае,
как правило, вся обработка соответствующего события будет про-
исходить именно в этом методе, однако, если handleEvent() возв-
ращает false, то вызывается handleEvent() для контейнера, со-
держащего данную компоненту.
События в AWT представляются с помощью об®ектов класса Event, в
котором определены следующие переменные:
public Object target; // инициатор события
public long when; // время, когда событие произошло
public int id; // тип события(KEY_PъESS, MOUSE_DOWN...)
public int x; // координаты
public int y; // курсора
public int key; // код клавиши
public int modifiers;// код модификатора (control, shift ...)
public Object arg; // вспомогательные данные
public Event evt; // поле для соединения событий в списки
Приведем типичный пример обработки событий, когда все они обра-
батываются на верхнем уровне (в данном случае на уровне апле-
та).
class MyApplet extends Applet {
. . .
public boolean action( Event evt, Object arg) {
. . .
if ((ev.target instanceof Button) && arg.equals ("OK")) {
// Выполнить соответствующие действия
. . .
return true;
} else {
// Другие случаи
. . .
}
. . .
return false;
}
. . .
}
В этом примере, если инициатор события имеет тип Button с име-
нем "OK", то выполняются соответствующие действия и возвращает-
ся значение true, то есть событие дальше не передается.
Другой способ обработать событие заключается в создании специа-
лизированной компоненты. Пример.
class OKButton extends Button {
. . .
public boolean action (Event e, Object arg) {
// Выполнить соответствующие действия
. . .
return true;
}
}
Мы видим, насколько глубоко продумана в проекте Java связь с
операционным окружением. Удалось достичь удачного сочетания бо-
гатства возможностей с переносимостью.
5. Joe - технология связывания Java-программ
с об®ектными бизнес-приложениями
Выше, в разделе "Java, Joe и NEO", мы писали о том, что новый
продукт компании SunSoft - Joe - призван осуществлять связь
между клиентскими компонентами, написанными на языке Java, и
об®ектными серверами приложений, созданными в среде NEO. При
этом Joe берет на себя все (или почти все) технические пробле-
мы, связанные с работой в распределенной об®ектной среде, обес-
печивая в то же время для Java-программ полноценное взаимодей-
ствие с произвольными об®ектными сервисами.
В предыдущих выпусках Jet Info была опубликована шутливая "Эво-
люция программиста". Мы добавим к ней еще два раздела. Первый
из приводимых ниже примеров написан на языке Java и можеи ис-
пользоваться в составе обычных, локально работающих аплетов.
1 import java.awt.Font;
2 import java.awt.Color;
3 public class JAVAhello extends java.applet.Applet {
4 Font f = new Font ("Timesъoman", Font.BOLD, 36);
5 public void init () {
6 resize (150, 25);
7 }
8 public void paint (Graphics g) {
9 g.setFont (f);
10 g.setColor (Color.blue);
11 g.drawString ("Hello, World!", 50, 25);
12 }
13 }
Теперь модифицируем программу для Joe, чтобы обеспечить возмож-
ность работы в среде клиент/сервер.
1 import sunw.services.*;
2 import java.awt.Graphics;
3 import java.awt.Font;
4 import java.awt.Color;
5 public class JOEhello extends sunw.services.JOEApplet {
6 sunw.corba.Objectъef obj;
7 Hello.HelloWorldъef hiThere;
8 Font f = new Font("Timesъoman", Font.BOLD, 36);
9 public void init () {
10 super.init ();
11 resize (150, 25);
12 obj = find ("HelloWorldServer");
13 hiThere = Hello.HelloWorldStub.narrow (obj);
14 }
15 public void paint (Graphics g) {
16 g.setFont (f);
17 g.setColor (Color.red);
// Получим строку из удаленного об®екта, реализованного на C++,
// и выведем ее.
18 g.drawString (hiThere.sayHello (), 50, 25);
Читать дальше