Валидация — это то, чего не хватает в базовой среде javafx. Чтобы заполнить этот пробел, уже есть сторонняя библиотека валидации, которая присутствует в controlsfx . Однако у меня есть одна проблема: она не была создана с учетом FXML. Нельзя сказать, что это не хорошая библиотека, она просто пропускает эту деталь, и для меня это не пойдет. Из-за этого я решил создать собственную платформу валидации: FXValidation .
Как это работает
Чтобы показать вам, как работает FXValidation, давайте начнем снизу вверх, показывая пример того, как может выглядеть файл FXML при использовании этой библиотеки. Это простой пример экрана входа в систему, где пользователю необходимо ввести как имя пользователя, так и пароль:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<Label> <text>User Name:</text></Label><TextField fx:id="userName" id="userName"></TextField><Label> <text>Password:</text></Label><PasswordField fx:id="password" id="password"></PasswordField><Button text="Submit" onAction="#submitPressed"></Button><fx:define> <RequiredField fx:id="requiredField1" > <srcControl> <fx:reference source="userName"></fx:reference> </srcControl> </RequiredField> <RequiredField fx:id="requiredField2" > <srcControl> <fx:reference source="password"></fx:reference> </srcControl> </RequiredField></fx:define><ErrorLabel message="Please enter your username"> <validator> <fx:reference source="requiredField1"></fx:reference> </validator></ErrorLabel><ErrorLabel message="Please enter your password"> <validator> <fx:reference source="requiredField2"></fx:reference> </validator></ErrorLabel> |
В начале фрагмента FXML я определяю текстовое поле и поле пароля для ввода данных для входа. Помимо этого есть также кнопка отправки, чтобы пользователь мог отправить информацию для входа в систему. После этого начинается интересная часть. Сначала мы определим пару валидаторов типа RequiredField. Это валидаторы, проверяют, являются ли данные ввода пустыми, и если это так, они хранят, что валидация содержит ошибки во флаге. Есть также другие типы валидаторов, встроенные в среду FXValidation, но мы вернемся к этому чуть позже . Наконец, мы определяем пару ErrorLabels. Это узлы, которые реализуют IValidationDisplay, любой класс, реализующий этот интерфейс, является классом, целью которого является отображение информации для пользователя при возникновении ошибки в процессе проверки. В настоящее время в структуре есть только один из этих классов: ErrorLabel. Наконец, нам нужно вызвать проверку, когда пользователь нажимает кнопку отправки, это делается в контроллере метода отправки:
|
1
2
3
4
|
public void submitPressed(ActionEvent actionEvent) { requiredField1.eval(); requiredField2.eval();} |
Это вызовет валидацию для определенных нами валидаторов. Если есть ошибки, ErrorLabels отобразит сообщение об ошибке, которое было определено в них. Есть также одна дополнительная вещь, которую делают валидаторы: они добавляют в класс стиля CSS «error» к каждому элементу управления, в котором произошла ошибка после того, как процесс валидации вступил в силу. Это позволяет программисту по-разному оформлять элементы управления с использованием css всякий раз, когда к этим элементам управления добавляется класс ошибок. Программист может проверять ошибки в процессе валидации, проверяя свойство hasErrors в валидаторах.
И вот наш пример в действии:
Детали
Из того, что я показал вам выше, мы видим, что в основном задействованы 2 типа классов:
- Валидатор: проверяет соответствие целевого элемента управления ( srcControl ) правилу валидации. Если нет, то он добавляет класс стиля «error» к целевому элементу управления, устанавливает для его свойства hasErrors значение true. Все валидаторы исходят из ValidatorBase .
- Отображаемая информация об ошибке: она заботится об информировании пользователя о том, что пошло не так с проверкой, может быть, что поле является обязательным, содержимое полей не имеет необходимого количества символов и т. Д. Все эти классы реализуют IValidationDisplay .
В библиотеке всего 3 валидатора и только один «обработчик ошибок» — ErrorLabel. Валидаторы следующие:
- RequiredField: проверяет, имеет ли целевой элемент управления ( srcControl ) содержимое, если нет, выдает ошибку.
- CardinalityValidator: проверяет, имеет ли целевой элемент управления ( srcControl ) хотя бы минимальное количество символов и максимальное максимальное количество символов.
- RegexValidator: проверяет содержимое целевого элемента управления ( srcControl ) по заданному регулярному выражению
Вот и все.
| Ссылка: | Валидация в java (javafx) от нашего партнера JCG Педро Дуке Виейры в блоге Pixel Duke . |
