Изменение отслеживания в текстовых компонентах Java

Изменение отслеживания в текстовых компонентах JavaСложности при работе с интерфейсом Document возникают только тогда, когда вы пытаетесь реализовать свой собственный текстовый редактор. Тем не менее, существует наиболее распространенный случай использования этого интерфейса: отслеживание изменений.

Иногда бывает необходимо обновлять часть пользовательского интерфейса всякий раз, когда пользователь редактирует текст, не ожидая, пока пользователь щелкнет на кнопке. Ниже представлен простой пример. Мы отображаем три текстовых поля для красного, голубого и зеленого компонентов цвета. Всякий раз, когда изменяется содержимое текстовых полей, необходимо обновлять цвета. На рис. 1 показано работающее приложение, код которого будет представлен в конце статьи.

Изменение отслеживания в текстовых компонентах JavaРис.1. Отслеживание изменений в текстовом поле.

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

Текст может быть обновлен в результате действий, производимых с помощью мыши(например, использование средней кнопки мыши для вставки данных в системе X11). Вместо этого, вам нужно «попросить» документ(а не компонент текста) уведомлять вас всякий раз, когда производится изменение данных. Для этого потребуется установить слушатель документа(document listener):

После того как текст будет изменен, вызывается один из следующих методов:

Первые два метода вызываются при вставке или удаления символов. Третий метод для текстовых полей не вызывается вообще. Для более сложных типов документов он может быть вызван при некотором другом изменении, таком как изменение в форматировании.

К сожалению, нет возможности сообщить об изменении текста посредством одиночного обратного вызова — как правило, вам не следует беспокоиться о том, как он изменяется. Более того, на этот случай даже нет специального класса. Таким образом, ваш слушатель документа должен реализовывать все три метода. Ниже показано, что предпринимается в программе:

Метод setColor() использует метод getText для получения строк, вводимых пользователем в данный момент времени, из текстовых полей и установки цвета.

Наша программа имеет одно ограничение. Пользователь может ввести в текстовом поле текст с ошибками(например, «мешина» вместо «машина») или вообще оставить его пустым. Пока что мы перехватываем исключение NumberFormatException, генерируемое методом parseInt, и просто не обновляем цвет, если запись в текстовом поле не является числом.

Кстати, вместо того, чтобы прослушивать события документа, можно добавить в поле слушатель события действия. Слушателю действия посылается уведомление всякий раз, когда пользователь нажимает клавишу <Enter>. Мы не рекомендуем применять такой подход, так как пользователи не всегда помнят о том, что нужно нажимать клавишу <Enter> после завершения ввода данных. Если вы используете слушатель действия, вам необходимо также установить слушатель фокуса, чтобы вы могли не пропустить момент, когда пользователь покинет текстовое поле.

Код программы: