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