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 -own для проверки таких вещей? Или у кого-нибудь есть лучшая идея, как реализовать именно эту функциональность с помощью методов разделения?

Ответы на вопрос(4)

DocumentFilter

Вы проверяетеэто а такжеэто для некоторых примеров.

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

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

Основные преимущества по сравнению с «нажмите кнопку и увидите сообщения об ошибках»:

мгновенная обратная связь для пользователя. Если веб-приложения могут избежать обратной передачи на сервер и использовать javascript для немедленной обратной связи, нет оправдания тому, чтобы этого не было в настольных приложениях. Нажатие кнопки для подтверждения - это 90 год.визуальная обратная связь важна, и лучше, чемInputVerifier который просто избегает изменения фокусамногоразовый компонент. Просто убедитесь, что ваш «пакет утилит» содержит кучуFormats (для дат, двойных чисел, целых чисел, диапазонов, ...), и вы можете справиться практически с любой ситуациейиз-за использованияFormatS, легко регулируемый для разныхLocalesВам никогда не нужно анализировать ввод послеJFormattedTextField, Весь код синтаксического анализа содержится в формате, и вы можете просто использоватьJFormattedTextField#getValueВсе проверки выполняютсяJFormattedTextField, Вы знаете, что значение, которое вы получаете, используяgetValue является действительным
 David Kroukamp21 окт. 2012 г., 17:35
+1 должен сказать не думал, что кто-то может быть лучшимInputVerifier :) полностью забывJFormattedTextField
Решение Вопроса

Одним из решений будет использование SwingInputVerifier проверить ввод для каждого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);
 David Kroukamp21 окт. 2012 г., 14:49
+1 хороший способ использовать :)

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

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

Ваш ответ на вопрос