Слушатель изменения значения в JTextField на Java
Быстрый ответ
Чтобы отслеживать изменения в текстовом поле JTextField, применяйте DocumentListener:
JTextField textField = new JTextField();
textField.getDocument().addDocumentListener(new DocumentListener() {
    public void insertUpdate(DocumentEvent e) { reactOnChange(); }
    public void removeUpdate(DocumentEvent e) { reactOnChange(); }
    // Для обычного текстового поля метод changedUpdate не требуется
    private void reactOnChange() {
        // Вставьте сюда код, реагирующий на изменение значения в поле
    }
});
Метод reactOnChange() будет вызываться как при добавлении текста, так и при его удалении, что позволяет анализировать каждое новое значение.

Глубже в пояснениях о DocumentListener
Валидация данных
Чтобы контролировать ввод пользователя и обработать введенные им данные, примените валидацию. Если, например, текст из JTextField нужно конвертировать в число, лучше написать сопутствующий метод. Ниже приведен пример обработки ситуаций, когда вводимое значение должно быть больше нуля:
private void validateAndProcess(JTextField textField) {
    try {
        int value = Integer.parseInt(textField.getText());
        if (value <= 0) {
            showWarning("Значение должно быть больше нуля.");
        } else {
            // Дальнейшая работа с корректным значением
        }
    } catch (NumberFormatException e) {
        showWarning("Не числовое значение.");
    }
}
private void showWarning(String message) {
    JOptionPane.showMessageDialog(null, message);
}
Отслеживание изменений позже с помощью PropertyChangeListener
Если необходимо реагировать на изменения, происшедшие не мгновенно, а после окончания ввода данных, используйте JFormattedTextField с PropertyChangeListener:
JFormattedTextField formattedTextField = new JFormattedTextField(new DefaultFormatter());
formattedTextField.addPropertyChangeListener("value", evt -> {
    // Обработка изменений после подтверждения введения корректных данных
});
formattedTextField.setCommitOnValidEdit(true);
Это позволяет выполнять действия только после того, как пользователь корректно завершил редактирование.
Расширенные методы обработки событий
Повторное использование DocumentListener
Создайте класс, реализующий DocumentListener, для изящного повторного использования кода, особенно если есть взаимодействие с несколькими полями JTextField:
public class MyDocumentListener implements DocumentListener {
    @Override
    public void insertUpdate(DocumentEvent e) { handleUpdate(e); }
    @Override
    public void removeUpdate(DocumentEvent e) { handleUpdate(e); }
    @Override
    public void changedUpdate(DocumentEvent e) { /* Обычное текстовое поле не провоцирует это событие. */ }
    
    private void handleUpdate(DocumentEvent e) {
        // Обработка измененного текста
    }
}
Особенности применения DocumentListener
DocumentListener имеет свои особенности:
- Первоначальное срабатывание: Событие может произойти сразу после подключения.
- Групповое обновление: Последовательно могут происходить несколько событий, что следует учитывать при реализации.
Визуализация
JTextField можно представить как дом (🏠), а обработчик изменений — как наблюдательного соседа (👀), зорко следящего за каждым происходящим действием:
Поступили изменения: ["🏠 с 🚗"]
Дом был обновлен:   ["🏠 с 🚗🚲"]
Наблюдательный сосед:  ["👀 Замечен новый велосипед!"]
Сосед (👀) тут же фиксирует любые изменения (🚲) в JTextField (🏠).
Повышение мастерства использования слушателей
Выбор подходящего слушателя
DocumentListener идеален для немедленного реагирования на обновления. Для отреагирования спустя некоторое время стоит рассмотреть использование ChangeListener.
Использование лямбда-выражений для удобства
Примените лямбда-выражения для более лаконичной реализации слушателей через вспомогательные методы:
public void addChangeListenerToTextField(JTextField textField, Consumer<String> onChange) {
    textField.getDocument().addDocumentListener((SimpleDocumentListener) e -> onChange.accept(textField.getText()));
}
addChangeListenerToTextField(myTextField, newText -> {
    // Обработка нового текста newText
});
SimpleDocumentListener упрощает реализацию DocumentListener.
Использование KeyListener вместо DocumentListener для отслеживания изменений текста не является идеальным выбором
Для обнаружения изменений в тексте лучше отказаться от использования KeyListener в пользу DocumentListener или PropertyChangeListener.
Мгновенная валидация с JFormattedTextField
Примените JFormattedTextField с правильно настроенным форматтером для получения быстрой обратной связи:
NumberFormatter numberFormatter = new NumberFormatter(NumberFormat.getIntegerInstance());
numberFormatter.setValueClass(Integer.class);
numberFormatter.setAllowsInvalid(false);
JFormattedTextField numberField = new JFormattedTextField(numberFormatter);
numberField.setCommitOnValidEdit(true); // Фокус на важности каждого произведенного действия
Такой подход обеспечивает быструю проверку и форматирование чисел.
Полезные материалы
- Как написать Document Listener — официальное руководство от Oracle.
- Как написать Property Change Listener — подробное руководство Oracle.
- Обработка изменения значения в JTextField – Stack Overflow — обсуждение на Stack Overflow.
- Java JTextField – javatpoint — обзор и примеры работы с JTextField.
- Использование текстовых компонентов — глубокое погружение в текстовые компоненты с применением слушателей, руководство от Oracle.
- Учебные пособия и примеры кода для программирования — сборник примеров кода для Java Swing.


