Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Пишущие Слушатели События
Раздел: Реализующие Слушатели для Обычно Обрабатываемых Событий
Как Записать Слушателю Фокуса
Домашняя страница > Создание GUI С JFC/Swing > Пишущие Слушатели События

Как Записать Слушателю Фокуса

События фокуса запускаются всякий раз, когда компонент получает или теряет клавиатурный фокус. Это - истина, происходит ли изменение в фокусе через мышь, клавиатуру, или программно. Чтобы стать знакомыми с основными понятиями фокуса или получить подробную информацию о фокусе, см., Как Использовать Подсистему Фокуса.

Этот раздел объясняет, как получить события фокуса для определенного компонента, регистрируясь a FocusListener экземпляр на этом. Чтобы получить фокус для окна только, реализуйте a WindowFocusListener экземпляр вместо этого. Чтобы получить состояние фокуса многих компонентов, рассмотрите реализацию a PropertyChangeListener экземпляр на KeyboardFocusManager class, как описано в Отслеживании Изменений Фокуса к Многократным Компонентам в том, Как Использовать Подсистему Фокуса.

Следующий пример демонстрирует события фокуса. Множество оконных дисплеев компонентов. Слушатель фокуса, зарегистрированный на каждом компоненте, сообщает о каждом полученном фокусом и потерянном фокусом событии. Для каждого события сообщают о другом компоненте, включенном в изменение фокуса, противоположный компонент. Например, когда фокус идет от кнопки до текстового поля, потерянное фокусом событие запускается кнопкой (с текстовым полем как противоположный компонент), и затем полученное фокусом событие запускается текстовым полем (с кнопкой как противоположный компонент). Потерянные фокусом так же как полученные фокусом события могут быть временными. Например, временное потерянное фокусом событие имеет место, когда окно теряет фокус. Временное полученное фокусом событие имеет место в раскрывающихся меню.

Окно События Фокуса, которое демонстрирует события, которые запускаются, когда клавиатурный фокус изменяется.

Выполнение Примера

  1. Нажмите кнопку Launch, чтобы работать, FocusEventDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает приложение FocusEventDemo
  2. Вы будете видеть "Полученный фокус: JTextField" сообщение в текстовой области Г €” ее "противоположный компонент" является нулем, так как это - первый компонент, который будет иметь фокус.
  3. Щелкните по метке. Ничто не происходит, потому что метка, по умолчанию, не может получить фокус.
  4. Щелкните по полю комбинированного списка. Потерянное фокусом событие запускается текстовым полем и полученным фокусом событием полем комбинированного списка. Поле комбинированного списка теперь показывает, что у него есть фокус, возможно с пунктирной линией вокруг текста ⠀” точно, как это представляется, зависимый стиль.
    Заметьте, что, когда фокус изменяется от одного компонента до другого, первый компонент запускает потерянное фокусом событие прежде, чем второй компонент запустит полученное фокусом событие.
  5. Выберите выбор из меню поля комбинированного списка. Щелкните по полю комбинированного списка снова. Заметьте, что ни о каком событии фокуса не сообщают. Пока пользователь управляет тем же самым компонентом, фокус остается на том компоненте.
  6. Щелкните по текстовой области, где события фокуса печатаются. Ничто не происходит, потому что текстовая область была представлена неактивизируемая по щелчку с setRequestFocusEnabled(false).
  7. Щелкните по текстовому полю, чтобы возвратить фокус начальному компоненту.
  8. Нажмите Вкладку на клавиатуре. Фокус перемещается в поле комбинированного списка и перескакивает через метку.
  9. Нажмите Вкладку снова. Фокус перемещается в кнопку.
  10. Щелкните по другому окну так, чтобы окно FocusEventDemo потеряло фокус. Временное потерянное фокусом событие сгенерировано для кнопки.
  11. Щелкните по вершине окна FocusEventDemo. Полученное фокусом событие запускается кнопкой.
  12. Нажмите Вкладку на клавиатуре. Фокус перемещается в список.
  13. Нажмите Вкладку снова. Фокус перемещается в текстовую область.
    Заметьте, что даже при том, что Вам не разрешают щелкнуть по текстовой области, можно снабдить вкладками к ней. Это - так пользователи, которые используют вспомогательные технологии, может решить, что компонент там и что он содержит. Демонстрационный пример отключает щелчок к фокусу для текстовой области, сохраняя ее возможность вкладки к фокусу, вызывая setRequestFocusEnabled(false) на текстовой области. Демонстрационный пример мог использовать setFocusable(false) чтобы действительно удалить текстовую область из цикла фокуса, но это имело бы неудачный эффект создания компонента, недоступного тем, кто использует вспомогательные технологии.
  14. Нажмите Вкладку снова. Фокус перемещается от списка назад к текстовому полю. Вы только что завершили цикл фокуса. См. введение в том, Как Использовать Подсистему Фокуса для обсуждения терминологии фокуса и понятий.

Полный код для этого демонстрационного примера находится в FocusEventDemo.java файл. Следующий фрагмент кода представляет механизм обработки событий фокуса:

public class FocusEventDemo ... implements FocusListener ... {
    public FocusEventDemo() {
        ...
        JTextField textField = new JTextField("A TextField");
        textField.addFocusListener(this);
        ...
        JLabel label = new JLabel("A Label");
        label.addFocusListener(this);
        ...
        JComboBox comboBox = new JComboBox(vector);
        comboBox.addFocusListener(this);
        ...
        JButton button = new JButton("A Button");
        button.addFocusListener(this);
        ...
        JList list = new JList(listVector);
        list.setSelectedIndex(1); //It's easier to see the focus change
                                  //if an item is selected.
        list.addFocusListener(this);
        JScrollPane listScrollPane = new JScrollPane(list);
        
        ...

        //Set up the area that reports focus-gained and focus-lost events.
        display = new JTextArea();
        display.setEditable(false);
        //The method setRequestFocusEnabled prevents a
        //component from being clickable, but it can still
        //get the focus through the keyboard - this ensures
        //user accessibility.
        display.setRequestFocusEnabled(false);
        display.addFocusListener(this);
        JScrollPane displayScrollPane = new JScrollPane(display);

        ...
    }
    ...
    public void focusGained(FocusEvent e) {
        displayMessage("Focus gained", e);
    }

    public void focusLost(FocusEvent e) {
        displayMessage("Focus lost", e);
    }

    void displayMessage(String prefix, FocusEvent e) {
        display.append(prefix
                       + (e.isTemporary() ? " (temporary):" : ":")
                       +  e.getComponent().getClass().getName()
                       + "; Opposite component: " 
                       + (e.getOppositeComponent() != null ?
                          e.getOppositeComponent().getClass().getName() : "null")
                       + newline); 
    }
    ...
}

API Слушателя Фокуса

Интерфейс FocusListener

Соответствующий адаптер class FocusAdapter.

Метод Цель
focusGained (FocusEvent) Вызванный сразу после слушаемого компонент получает фокус.
focusLost (FocusEvent) Вызванный сразу после слушаемого компонент теряет фокус.

API FocusEvent

Метод Цель
булев isTemporary () Возвращает истинное значение, если потерянное фокусом или полученное фокусом событие является временным.
Компонент getComponent ()
(в java.awt.event.ComponentEvent)
Возвращает компонент, который запустил событие фокуса.
Компонент getOppositeComponent () Возвращает другой компонент, включенный в изменение фокуса. Для a FOCUS_GAINED событие, это - компонент, который потерял фокус. Для a FOCUS_LOST событие, это - компонент, который получал фокус. Если изменение фокуса включает собственное приложение, приложение Java в различном VM или контексте, или никаком другом компоненте, то null возвращается.

Примеры тот Фокус Использования Слушатели

Следующая таблица приводит примеры тот фокус использования слушатели.

Пример Где Описано Примечания
FocusEventDemo Этот раздел Отчеты все события фокуса, которые происходят на нескольких компонентах, чтобы демонстрировать обстоятельства, при которых запускаются события фокуса.
TrackFocusDemo Как Использовать Подсистему Фокуса Пользовательский компонент, Picture, реализует слушателя фокуса, чтобы потянуть красную границу вокруг компонента, когда это - текущий владелец фокуса.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Записать Слушателю Документа
Следующая страница: Как Записать Слушателю Внутренней рамки