action
Как было отмечено ранее, action()
не является единственным методом, который мы используем для вызова handleEvent()
, когда все события классифицированы. Есть три других набора вызываемых методов, если мы хотим захватывать определённые типы событий (клавиатура, мышь и события фокуса), поэтому нам приходится переопределять указанные методы. Эти методы определены в базовом компоненте, так что они полезны практически во всех компонентах, которые мы можем поместить в окно. Однако мы также заметили, что этот подход не поддерживается в Java версии 1.1, и хотя мы можем отметить использование этого подхода в наследуемых кодах, мы будем использовать альтернативный метод, доступный в Java 1.1 (подробнее будет рассмотрено позже в этой главе).| Метод компонента | Когда вызывается |
| --- | --- |
| action(Event evt, Object what)
| Вызывается, когда происходит типичное событие для компонента (например, нажатие кнопки или выбор пункта выпадающего списка) |
| keyDown(Event evt, int key)
| Вызывается, когда клавиша нажата и компонент имеет фокус. Второй параметр — это нажатая клавиша и является избыточной копией из evt.key
|
| keyUp(Event evt, int key)
| Вызывается, когда клавиша отпущена и компонент имеет фокус |
| lostFocus(Event evt, Object what)
| Вызывается, когда фокус уходит с компонента. Обычно, what
является избыточной копией из evt.arg
|
| gotFocus(Event evt, Object what)
| Вызывается, когда фокус перемещается на компонент |
| mouseDown(Event evt, int x, int y)
| Вызывается, когда произошло нажатие мыши над компонентом в координатах X, Y |
| mouseUp(Event evt, int x, int y)
| Вызывается, когда произошло отпускание мыши над компонентом |
| mouseMove(Event evt, int x, int y)
| Вызывается, когда мышь перемещается над компонентом |
| mouseDrag(Event evt, int x, int y)
| Вызывается, когда мышь движется после события mouseDown
. Все события движения передаются внутреннему компоненту, где произошло событие mouseDown
, до тех пор пока не произойдет событие mouseUp
|
| mouseEnter(Event evt, int x, int y)
| Вызывается, когда мышь была вне компонента, но теперь находится внутри него || mouseExit(Event evt, int x, int y)
| Вызывается, когда мышь находилась над компонентом, но теперь вышла из него | Когда мы обрабатываем специальные случаи — например, событие мыши, которое точно совпадает с координатами, где существует нужное нам событие мыши, мы видим, что каждое программное обеспечение получает событие вместе с некоторой информацией, которая нам необходима. Интересно отметить, что при вызове метода handleEvent()
компонентом (типичный пример), дополнительные аргументы всегда являются излишними, так как они уже содержатся в объекте события. В действительности, если внимательно рассмотреть исходный код component.handleEvent()
, можно заметить, что он явно извлекает дополнительные параметры из объекта события (что может быть связано с низкими показателями эффективности в некоторых языках программирования, но помните, что безопасность является ключевой задачей Java, поэтому нет необходимости беспокоиться об этом). Эксперименты показывают, что эти события действительно вызываются, и создание перегруженной версии каждого метода (перегрузка action()
рассматривается в других частях этой главы) может быть интересным экспериментом, который отображает связанные данные при возникновении события. Этот пример также демонстрирует, как создается объект кнопки, поскольку он используется в качестве целевого объекта для всех событий. |Я могу предположить, что сначала (и это обязательно) создается новый объект кнопки, который наследуется от кнопки. Однако это не работает. Вместо этого мы наследуемся от компонента холста (очень простого компонента) и рисуем кнопку без использования метода paint()
. Как мы видим, после того как некоторый код был внедрен в рисование кнопки, она просто не работает, что очень плохо. (Если вы мне не верите, попробуйте заменить кнопку на компонент холста в этом примере, не забудьте вызвать конструктор базового класса через super
. Вы заметите, что кнопка не будет отрисована, а события не будут обрабатываться.)## Класс MyButton
Класс MyButton
расширяет класс Canvas
. У него есть следующие поля:
AutoEvent parent
: родительское событие.Color color
: цвет кнопки.String label
: метка кнопки.Конструктор принимает три аргумента: parent
, color
и label
.
public MyButton(AutoEvent parent, Color color, String label) {
this.label = label;
this.parent = parent;
this.color = color;
}
Метод paint
отрисовывает кнопку с закругленными углами и текстом внутри кнопки.
public void paint(Graphics g) {
g.setColor(color);
int rnd = 30;
g.fillRoundRect(0, 0, size().width, size().height, rnd, rnd);
g.setColor(Color.BLACK);
g.drawRoundRect(0, 0, size().width, size().height, rnd, rnd);
}
``` FontMetrics fm = g.getFontMetrics();
int width = fm.stringWidth(label);
int height = fm.getHeight();
int ascent = fm.getAscent();
int leading = fm.getLeading();
int horizMargin = (size().width - width) / 2;
int vertMargin = (size().height - height) / 2;
g.setColor(Color.white);
g.drawString(label, horizMargin, vertMargin + ascent + leading);
}
Обрабатывает нажатие клавиш.
public boolean keyDown(Event evt, int key) {
TextField t = (TextField) parent.h.get("keyDown");
t.setText(evt.toString());
return true;
}
Обрабатывает отпускание клавиш.
public boolean keyUp(Event evt, int key) {
TextField t = (TextField) parent.h.get("keyUp");
t.setText(evt.toString());
return true;
}
Обрабатывает потерю фокуса.
public boolean lostFocus(Event evt, Object w) {
TextField t = (TextField) parent.h.get("lostFocus");
t.setText(evt.toString());
return true;
}
Обрабатывает получение фокуса.
public boolean gotFocus(Event evt, Object w) {
TextField t = (TextField) parent.h.get("gotFocus");
t.setText(evt.toString());
return true;
}
Обрабатывает нажатие кнопки мыши.
public boolean mouseDown(Event evt, int x, int y) {
TextField t = (TextField) parent.h.get("mouseDown");
t.setText(evt.toString());
return true;
}
Обрабатывает движение мыши при зажатой кнопке.
public boolean mouseDrag(Event evt, int x, int y) {
TextField t = (TextField) parent.h.get("mouseDrag");
t.setText(evt.toString());
return true;
}
Обрабатывает вхождение курсора мыши в область компонента.
public boolean mouseEnter(Event evt, int x, int y) {
TextField t = (TextField) parent.h.get("mouseEnter");
t.setText(evt.toString());
return true;
}
```#### Метод mouseExit
Обрабатывает выход курсора мыши из области компонента.
```java
public boolean mouseExit(Event evt, int x, int y) {
TextField t = (TextField)parent.h.get("mouseExit");
t.setText(evt.toString());
return true;
}
Обрабатывает перемещение курсора мыши.
public boolean mouseMove(Event evt, int x, int y) {
TextField t = (TextField)parent.h.get("mouseMove");
t.setText(evt.toString());
return true;
}
public String toString()) {
return true;
}
public boolean mouseUp(Event evt, int x, int y) {
TextField t =
(TextField) parent.h.get("mouseUp");
t.setText(evt.toString());
return true;
}
Примечание: В данном случае нет необходимости в переводе, так как это код на Java, который выполняет определенные действия с объектами и переменными. Код остается без изменений, а если бы были какие-то строки документации или комментарии, то они бы были переведены на русский язык согласно правилам.
public class AutoEvent extends Applet {
Hashtable h = new Hashtable();
String[] event = {
"keyDown", "keyUp", "lostFocus",
"gotFocus", "mouseDown", "mouseUp",
"mouseMove", "mouseDrag", "mouseEnter",
"mouseExit"
};
MyButton
b1 = new MyButton(this, Color.blue, "test1"),
b2 = new MyButton(this, Color.red, "test2");
public void init() {
setLayout(new GridLayout(event.length + 1, 2));
for (int i = 0; i < event.length; i++) {
TextField t = new TextField();
t.setEditable(false);
add(new Label(event[i], Label.CENTER));
add(t);
h.put(event[i], t);
}
add(b1);
add(b2);
}
} ///:~
```Можно заметить, что конструктор использует метод с тем же именем аргументов, поэтому аргументы присваиваются значения, и `this` используется для отличия:
```java
this.название = название;
Метод paint()
начинается просто: он заполняет "круглую" область цветом кнопки, затем рисует черную линию вокруг неё. Обратите внимание на использование getSize()
, которое определяет ширину и высоту компонента (конечно, в пикселях). После этого, метод paint()
выглядит сложным из-за большого количества предсказаний, необходимых для расчета того, как использовать "metrics шрифта" для центрирования метки кнопки внутри кнопки.Вы сможете правильно понять работу методов keyDown()
, keyUp()
и других только после осознания класса AutoEvent
. Этот класс содержит хэш-таблицу для управления строками, описывающими события обработки, и типом TextField
. Конечно, эти строки могут быть статически созданы вместо помещения их в хэш-таблицу, но я уверен, что вы согласитесь, что это проще использовать и менять. Особенно если нам нужно добавить или удалить новый тип события в AutoEvent
, мы можем просто добавить или удалить строку из списка событий — всё остальное будет автоматически выполнено. Мы выяснили положение строк в методах keyDown()
, keyUp()
и других, когда они были возвращены обратно в myButton
. Любой из этих методов использует родительскую ссылку для возврата в родительское окно. Родительским объектом является AutoEvent
, который содержит хэш-таблицу h
и метод get()
. Когда имеется определённая строка, этот метод создаёт ссылку на известный нам объект TextField
(поэтому он выбирается). Затем объект события модифицирует строковое значение, отображаемое в TextField
. Из примеров, которые мы можем наблюдать с момента запуска событий в нашем приложении, можно сделать вывод, что это довольно интересно.Обратите внимание, что в данном контексте было использовано понятие "выбор" объекта TextField
, который может быть интерпретирован как выбор объекта для выполнения действий над ним. В зависимости от конкретной реализации, это может означать активацию объекта или его использование в качестве целевого объекта для операций.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )