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

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

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

13.11 Списковый выбор

Списковый выбор отличается от выпадающего списка не только тем, как он отображается при активации, но и тем, что он остаётся в фиксированной позиции на экране. Кроме того, список позволяет множественный выбор: если мы щёлкаем по нескольким элементам, незадействованные элементы выделяются сильнее, и мы можем выбрать столько элементов, сколько нам нужно. Чтобы просмотреть выбранные элементы, можно использовать метод getSelectedItem(), который вернёт список выбранных элементов. Для удаления элемента из группы достаточно снова щёлкнуть по нему. Однако здесь есть проблема: по умолчанию действие происходит при двойном щёлчке, а не при одном. Одиночный щёлчок добавляет или удаляет элемент из группы, а двойной вызывает метод action(). Решение этой проблемы заключается в переобучении наших пользователей.

//: List1.java
// Использование списков с методом action()
import java.awt.*;
import java.applet.*;
``````java
public class List1 extends Applet {
  String[] flavors = { "Шоколад", "Клубника",
    "Мятный чип", "Моховый пирог",
    "Мока- almond fudge", "Рум-raisin",
    "Пралине крем", "Муд пай" };
  // Отобразить 6 элементов, позволить множественный выбор:
  List lst = new List(6, true);
  TextArea t = new TextArea(flavors.length, 30);
  Button b = new Button("тест");
  int count = 0;
  public void init() {
    t.setEditable(false);
    for(int i = 0; i < 4; i++)
      lst.addItem(flavors[count++]);
    add(t);
    add(lst);
    add(b);
  }
  public boolean action(Event evt, Object arg) {
    if(evt.target.equals(lst)) {
      t.setText("");
      String[] items = lst.getSelectedItems();
      for(int i = 0; i < items.length; i++)
        t.appendText(items[i] + "\n");
    } else if(evt.target.equals(b)) {
      if(count < flavors.length)
        lst.addItem(flavors[count++], 0);
    } else
      return super.action(evt, arg);
    return true;
  }
}
///:~

```Нажатие кнопки добавляет элемент в начало списка (вторым параметром метода addItem() передается значение 0). Добавление элементов в список более логично, чем в выпадающий список, так как пользователи ожидают прокручивать список (поэтому у него есть встроенные полосы прокрутки), тогда как они не хотят считать, где находится нужный им элемент, как это было в предыдущих примерах. Однако единственным способом вызова метода `action()` является двойной щелчок. Если мы хотим наблюдать за действиями пользователя в нашем списке (особенно за одиночными щелчками), нам следует предоставить альтернативный метод. ## 13.11.1 handleEvent()

До сих пор мы использовали action(), но теперь есть ещё один метод handleEvent(), который позволяет попробовать каждое событие отдельно. Когда происходит событие, оно всегда связано с отдельным событием или объектом события. Метод handleEvent() этого объекта вызывается автоматически и создаётся вместе со всеми передаваемыми в него аргументами. По умолчанию метод handleEvent() (определённый внутри компонента, все контролы базового класса находятся в AWT) будет вызывать action() или другие аналогичные методы для указания активности мыши, клавиатуры или перемещения фокуса. Мы рассмотрим это подробнее позже в этой главе.А что делать, если другие методы, особенно action(), не удовлетворяют нашим требованиям? Например, для выпадающего списка, если мне нужно захватить щелчок мыши, но action() реагирует только на двойной щелчок, как быть? Ответ — переопределить handleEvent(). Поскольку он получен из фрагмента программы, его можно переопределять для любого непредопределенного метода. Когда мы переопределяем handleEvent() для фрагмента программы, мы получаем все события до того, как они будут отправлены, поэтому мы не можем предположить, что "тут есть событие кнопки, которую можно нажать". В handleEvent() кнопка может иметь фокус, и кто-то может его назначить. Независимо от того, является ли это логичным, мы можем тестировать эти события и действовать согласно handleEvent().## Класс List2, расширяющий Applet

Описание

Класс List2 представляет собой расширение класса Applet. В данном примере используется массив строковых значений flavors, содержащий различные названия мороженного.

Объявление переменных

String[] flavors = { "Шоколад", "Смородина",
  "Ваниль с фундуком", "Мятный чип",
  "Мока с арахисовым фундуком", "Рум сraisin",
  "Прудин крем", "Муд пай" };

Также объявлены следующие переменные:

  • lst: объект типа List, который позволяет отображать до 6 элементов и поддерживает множественный выбор.
  • t: объект типа TextArea, используемый для вывода информации.
  • b: объект типа Button, служащий для тестирования.

Метод init

Инициализирует компоненты формы:

public void init() {
  t.setEditable(false); // Отключает возможность редактирования текстового поля
  for(int i = 0; i < 4; i++) {
    lst.addItem(flavors[count++]); // Добавляет элементы в список
  }
  add(t); // Добавляет текстовое поле на форму
  add(lst); // Добавляет список на форму
  add(b); // Добавляет кнопку на форму
}

Метод handleEventОбрабатывает события, связанные с выбором и снятием выделения элементов списка:

public boolean handleEvent(Event evt) {
  if (evt.id == Event.LIST_SELECT || evt.id == Event.LIST_DESELECT) {
    if (evt.target.equals(lst)) {
      t.setText(""); // Очищает текстовое поле
      String[] items = lst.getSelectedItems(); // Получает выбранные элементы
      for (int i = 0; i < items.length; i++) {
        t.appendText(items[i] + "\n"); // Добавляет выбранные элементы в текстовое поле
      }
    } else {
      return super.handleEvent(evt); // Передает управление родителю
    }
  } else {
    return super.handleEvent(evt); // Передает управление родителю
  }
  return true;
}

Метод action

Обрабатывает действия пользователя, такие как нажатие кнопки:```java public boolean action(Event evt, Object arg) { if (evt.target.equals(b)) { if (count < flavors.length) { lst.addItem(flavors[count++], 0); // Adds a new item to the list } } else { return super.action(evt, arg); // Passes control to the parent } return true; }

```Этот пример очень похож на предыдущий, с той лишь разницей, что здесь добавлен метод `handleEvent()`. В программе были выполнены тесты для проверки выбора и отсутствия выбора в списке. Помните, что метод `handleEvent()` переопределяется в каждом фрагменте программы, поэтому он может находиться в любом месте формы и обрабатывать события для других списков. Таким образом, нам также необходимо выполнять тесты для наблюдения за целевым поведением. (Хотя в данном примере присутствует только один список, можно предположить, что все события списка должны обслуживать именно этот список. Это неправильный подход, поскольку добавление другого списка приведёт к ошибкам в программе.) Если список соответствует нашему интересующемуся списку, то код будет выполняться по аналогичной стратегии, как и ранее. Обратите внимание, что форма, связанная с методом `handleEvent()`, совпадает с формой, связанной с методом `action()`: если мы обрабатываем отдельное событие, мы возвращаем истинное значение, но если мы не интересуемся другими событиями, через метод `handleEvent()` мы должны вернуть значение `super.handleEvent()`. Именно это является ключевой частью программы; если этого не сделать, ни одно другое событие не будет обработано. 
```Например, попробуйте заменить в приведённом выше коде возврат значения `super.handleEvent(evt)`. Мы заметим, что метод `action()` не был вызван, что, конечно, не то, что мы хотели бы получить. Для методов `action()` и `handleEvent()`, самое важное — следовать формату, представленному в данном примере, и всегда возвращать версию базового класса, когда мы сами не обрабатываем события (в данном случае мы возвращаем истинное значение).

(К счастью, такие ошибки характерны только для Java 1.0; новые дизайны Java 1.1, которые будут рассмотрены позже в этой главе, устраняют эти типы ошибок.)В Windows, если нажать клавишу `Shift`, список позволяет выполнять множественный выбор. Это очень полезно, так как позволяет пользователю выбирать либо один, либо несколько элементов вместо ограничения одним выбором при написании программы. Мы могли бы подумать, что стали более продвинутыми, и если одиночный щелчок мыши создается методом `evt.shiftDown()`, когда клавиша `Shift` нажата, мы могли бы выполнить свой собственный тестовый код. Однако дизайн AWT мешает нам — нам нужно знать, какой проект был выбран мышью, а также была ли нажата клавиша `Shift`, чтобы мы могли удалить все остальные выбранные элементы и выбрать только один. Независимо от этого, это было невозможно сделать в Java 1.0. (Java 1.1 передает все события мыши, клавиш и фокуса в список, поэтому теперь мы можем это сделать.)

Примечание: В данном контексте "фрагмент программы" можно рассматривать как "компонент" или "контейнер", который использует метод `handleEvent()`.

Опубликовать ( 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