Swing: событие потери фокуса текстового поля против события нажатия кнопки

У меня есть форма с различными текстовыми полями (скажем, около 10). После того, как пользователь заполняет значение в каждом текстовом поле, оно проверяется на событии focuslost для текстового поля.

public void focusLost(FocusEvent e)
    {

        JTextField tf = (JTextField)(e.getSource());
        String finalVal = tf.getText();
        try
        {
            validate(finalVal);
        }
        catch(NmfException ex)
        { 
            JOptionPane.showMessageDialog(parent, message, title,
                                    JOptionPane.ERROR_MESSAGE);//Error Message is passed
/* Error pop up is displayed when validation fails. Message text with an 'Ok' button is displayed and the code waits for ok to be clicked to execute rest of the code*/
            tf.setText(defaultVal);//Value is reset to default value
            return;
        }

    }

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

Но моя проблема в том, что когда в текстовое поле вводится неверный ввод (скажем, -5 недопустимый ввод), и сразу нажимается кнопка «Добавить». Запускается событие focusLost и появляется всплывающее окно, в то время как код ожидает нажатия кнопки «ОК» во всплывающем окне, также вызывается следующее событие нажатия кнопки. Таким образом, перед defaultVal может быть установлено как значение текстового поля, операция кнопки «Добавить» выполняется (дальнейшая проверка в операции добавления не выполняется), и на сервер отправляются недопустимые входные данные.

Как можно гарантировать, что операция добавления вызывается только после выполнения операции события focusLost. Предложите решение проблемы? Что было бы наилучшей практикой для такого сценария?


person codingBliss    schedule 30.11.2015    source источник
comment
Вы можете ознакомиться с Проверка ввода . Отключите кнопку «Добавить», пока не сможете проверить все поля. Вы также можете использовать DocumentListener   -  person MadProgrammer    schedule 30.11.2015


Ответы (2)


Установите один флаг, который следует проверять при нажатии кнопки «Добавить».

Итак, если все проверки должны быть истинными/ОК, отправьте на сервер.

если флаг ложный / недействительный, нажмите «Добавить», а затем дайте пользователю подсказку с сообщением об ошибке.

В соответствии с вашим сценарием, если кто-то попытается добавить недопустимое значение, тогда событие focusLost сделает флаг -> ложным и наоборот.

Точно так же необходимо разработать архитектуру кодирования.

person Vishal Gajera    schedule 30.11.2015

Вы также можете использовать прослушиватель мыши в текстовых полях и проверять в методе mouseExited

person FredK    schedule 30.11.2015