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
который просто избегает изменения фокуса - высокой степени повторного использования компонент. Просто убедитесь, что ваш "пакет кода утилиты" содержит кучу
Format
s (для дат, двойников, целых чисел, диапазонов,... ) и вы можете справиться практически с любой ситуацией - из-за использование
Format
s, легкое регулируемое для различногоLocale
s - вам никогда не нужно анализировать входные данные после
JFormattedTextField
. Весь код синтаксического анализа содержится в формате, и вы можете просто использоватьJFormattedTextField#getValue
- вся проверка выполняется
JFormattedTextField
. Вы знаете, что значение, которое вы получаете с помощьюgetValue
правильная
есть много вещей, которые вы можете сделать. Простой-это метод, который проверяет список строк для parseability в инт. Для дополнительных проверок у вас будет больше методов, которые проверяют некоторые типичные вещи, такие как диапазон чисел. Поэтому разделите каждый вид проверки на свой собственный метод и составьте их по мере необходимости.
в противном случае существуют полные рамки проверки, которые обрабатывают такие вещи. Я бы сказал, что они легко гуглябельны.
вы можете получить проверку в реальном времени через использование DocumentFilter
проверить этой и этой для некоторые примеры.
Я думаю, однако, вы можете найти JFormattedTextField
более подходящее решение в данном случае.