如何在验证多个输入字段时避免重复的代码?
问题描述:
如何在验证多个输入字段时避免重复代码,如TextField
s,DatePicker
s,ChoiceBox
es?以下代码属于StageAddController
用于监听和验证输入的服务类别。当焦点丢失且字段为空时,字段边框变为红色。如何在验证多个输入字段时避免重复的代码?
public void validateForEmptyTextField(TextField textField, PseudoClass errorClass){
textField.focusedProperty().addListener((arg0, oldValue, newValue) -> {
if (!newValue) { //when focus lost
if(textField.getText().trim().isEmpty()){
textField.pseudoClassStateChanged(errorClass, true);
}
else
textField.pseudoClassStateChanged(errorClass, false);
}
});
}
public void validateForEmptyDatePicker (DatePicker datePicker, PseudoClass errorClass){
datePicker.focusedProperty().addListener((arg0, oldValue, newValue) -> {
if (!newValue) { //when focus lost
if(datePicker.getValue() == null){
datePicker.pseudoClassStateChanged(errorClass, true);
}
else
datePicker.pseudoClassStateChanged(errorClass, false);
}
});
}
public void validateForEmptyChoiceBox (ChoiceBox<String > stringChoiceBox, PseudoClass errorClass){
stringChoiceBox.focusedProperty().addListener((arg0, oldValue, newValue) -> {
if (!newValue) { //when focus lost
if(stringChoiceBox.getValue() == null){
stringChoiceBox.pseudoClassStateChanged(errorClass, true);
}
else
stringChoiceBox.pseudoClassStateChanged(errorClass, false);
}
});
}
答
它可以通过引入其延伸的通用参数T
来实现Node
(1)并通过一个Predicate<T>
(2):
public <T extends Node> void validateNodeForEmptyByPredicate(
T node,
PseudoClass errorClass,
Predicate<T> predicate
) {
node.focusedProperty().addListener((arg0, oldValue, newValue) -> {
if (!newValue) {
node.pseudoClassStateChanged(errorClass, predicate.test(node)); // *
}
});
}
- (1)它是需要访问方法
focusedProperty
; - (2)它是要去决定是否一个
T
是空的,例如:- 为
TextField
秒 - >field -> field.getText().trim().isEmpty()
; - for
DatePicker
s - >picker -> picker -> picker.getValue() == null
; - for
ChoiceBox
es - >box -> box.getValue() == null
。
- 为
我想重写如下代码块(*)
if (predicate.test(node)) {
node.pseudoClassStateChanged(errorClass, true);
} else {
node.pseudoClassStateChanged(errorClass, false);
}
成:
node.pseudoClassStateChanged(errorClass, predicate.test(node));