2017-08-12 39 views
1

如何在验证多个输入字段时避免重复代码,如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); 
     } 
    }); 
} 

回答

3

它可以通过引入其延伸的通用参数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));