1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-thinking-in-java-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
13.13 action的替代品.md 16 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 11.03.2025 09:15 d56454c

13.13 Альтернативы для 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

Метод 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);
}

Обработчики событий клавиш

Метод keyDown

Обрабатывает нажатие клавиш.

public boolean keyDown(Event evt, int key) {
    TextField t = (TextField) parent.h.get("keyDown");
    t.setText(evt.toString());
    return true;
}

Метод keyUp

Обрабатывает отпускание клавиш.

public boolean keyUp(Event evt, int key) {
    TextField t = (TextField) parent.h.get("keyUp");
    t.setText(evt.toString());
    return true;
}

Обработчики событий фокуса

Метод lostFocus

Обрабатывает потерю фокуса.

public boolean lostFocus(Event evt, Object w) {
    TextField t = (TextField) parent.h.get("lostFocus");
    t.setText(evt.toString());
    return true;
}

Метод gotFocus

Обрабатывает получение фокуса.

public boolean gotFocus(Event evt, Object w) {
    TextField t = (TextField) parent.h.get("gotFocus");
    t.setText(evt.toString());
    return true;
}

Обработчики событий мыши

Метод mouseDown

Обрабатывает нажатие кнопки мыши.

public boolean mouseDown(Event evt, int x, int y) {
    TextField t = (TextField) parent.h.get("mouseDown");
    t.setText(evt.toString());
    return true;
}

Метод mouseDrag

Обрабатывает движение мыши при зажатой кнопке.

public boolean mouseDrag(Event evt, int x, int y) {
    TextField t = (TextField) parent.h.get("mouseDrag");
    t.setText(evt.toString());
    return true;
}

Метод mouseEnter

Обрабатывает вхождение курсора мыши в область компонента.

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;
}

Метод mouseMove

Обрабатывает перемещение курсора мыши.

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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-thinking-in-java-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-thinking-in-java-zh.git
oschina-mirror
wizardforcel-thinking-in-java-zh
wizardforcel-thinking-in-java-zh
master