Java Swing: реализация проверки достоверности входных значений

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

структура этой проверки следующая (пример):

Button buttonToOpenNextWindow = new JButton("next");
button.addActionListener(new ActionListener(){

    public void actionPerformed(ActionEvent e){
        if(checkValidty){
            // (...)
            new WindowA();
            frame.dispose(); // (*)
        }
    }
});

(*) Примечание: Я знаю, что принцип нескольких JFrames уродлив, и я собираюсь изменить это, но для этого вопроса это неуместный.

теперь фокус этого вопроса заключается в следующем checkValidity(), которые я структурировал следующим образом:

private boolean checkValidity(){

    // check input 1
    try{
        Integer.parseInt(textField1.getText());
    }catch (NumberFormatException e){
        new ErrorDialog("input 1 is invalid!"); // own implemented dialog
        return false;
    }

    // check input 2
    try{
        Integer.parseInt(textField2.getText());
    }catch (NumberFormatException e){
        new ErrorDialog("input 2 is invalid!"); // own implemented dialog
        return false;
    }

    // (...)

    // check input n
    try{
        Integer.parseInt(textField_n.getText());
    }catch (NumberFormatException e){
        new ErrorDialog("input n is invalid!"); // own implemented dialog
        return false;
    }
    return true;
}

это работает точно так, как я хочу, но сам код очень уродлив, потому что, имея несколько вариантов ввода, метод получает 200, 300 или более строк (поскольку я не только проверяю, например, это число, но и если число имеет смысл в контексте логики программы и так далее). Есть ли собственный метод Swing для проверки таких вещей? Или у кого-нибудь есть идея получше, как реализовать именно эту функциональность с помощью методов split?

4 ответов


одним из решений было бы использовать качели InputVerifier для проверки ввода для каждого JTextField используется. Поскольку функции проверки одинаковы для каждого поля, для всех компонентов можно использовать один экземпляр:

public class MyNumericVerifier extends InputVerifier {
    @Override
    public boolean verify(JComponent input) {
       String text = ((JTextField) input).getText();
       try {
          Integer.parseInt(text);
       } catch (NumberFormatException e) {
          return false;
       }

       return true;
    }
}

InputVerifier verifier = new MyNumericVerifier()
textField1.setInputVerifier(verifier);

Я предпочитаю использовать улучшенную версию JFormattedTextField. Под улучшенным я подразумеваю лучшее поведение каретки, проверку каждого изменения для обеспечения немедленной обратной связи с пользователем (например, изменение цвета фона, когда ввод недействителен)... . Это в сочетании с кнопкой, которая отключена, пока вход не будет действительным.

основные преимущества над "нажмите кнопку и увидеть сообщения об ошибках появляются":

  • мгновенная обратная связь для пользователя .Если web-приложения могут избежать туда и обратно сервер и использовать javascript для немедленной обратной связи, нет никаких оправданий для того, чтобы не иметь, что в настольных приложениях. Нажатие кнопки для проверки-это так ' 90.
  • визуальная обратная связь важна, и лучше, чем InputVerifier который просто избегает изменения фокуса
  • высокой степени повторного использования компонент. Просто убедитесь, что ваш "пакет кода утилиты" содержит кучу Formats (для дат, двойников, целых чисел, диапазонов,... ) и вы можете справиться практически с любой ситуацией
  • из-за использование Formats, легкое регулируемое для различного Locales
  • вам никогда не нужно анализировать входные данные после JFormattedTextField. Весь код синтаксического анализа содержится в формате, и вы можете просто использовать JFormattedTextField#getValue
  • вся проверка выполняется JFormattedTextField. Вы знаете, что значение, которое вы получаете с помощью getValue правильная

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

в противном случае существуют полные рамки проверки, которые обрабатывают такие вещи. Я бы сказал, что они легко гуглябельны.


вы можете получить проверку в реальном времени через использование DocumentFilter

проверить этой и этой для некоторые примеры.

Я думаю, однако, вы можете найти JFormattedTextField более подходящее решение в данном случае.