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



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

742   4  

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. Под улучшенным я подразумеваю лучшее поведение каретки, проверку каждого изменения для обеспечения немедленной обратной связи с пользователем (например, изменение цвета фона, когда ввод недопустим)... . Это в сочетании с кнопкой, которая отключена до тех пор, пока вход не будет действительным.

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

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

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

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

Вы можете получить проверку в реальном времени с помощью use a DocumentFilter

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

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

Comments

    Ничего не найдено.