2017-08-12 7 views
1

Wie vermeidet man doppelten Code bei der Validierung mehrerer Eingabefelder wie TextField s, DatePicker s, ChoiceBox es? Dieser Code gehört zu der Serviceklasse, die von StageAddController verwendet wird, um die Eingabe zu überwachen und zu validieren. Wenn der Fokus verloren geht und das Feld leer ist, wird die Feldgrenze rot.Wie vermeidet man doppelten Code bei der Validierung mehrerer Eingabefelder?

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); 
     } 
    }); 
} 

Antwort

3

Es kann T durch Einführung eines generischen Parameter erreicht werden, die Node (1) erstreckt, und Leiten eines 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) es benötigt wird, um Zugang zu haben, um die focusedProperty Methode;
  • (2) es ist gonna zu entscheiden, ob ein T leer ist, zum Beispiel:
    • für TextField s ->field -> field.getText().trim().isEmpty();
    • für DatePicker s ->picker -> picker -> picker.getValue() == null;
    • für ChoiceBox es -> .

I möchte folgenden Codeblock (*)

if (predicate.test(node)) { 
    node.pseudoClassStateChanged(errorClass, true); 
} else { 
    node.pseudoClassStateChanged(errorClass, false); 
} 

in neu zu schreiben:

node.pseudoClassStateChanged(errorClass, predicate.test(node)); 
Verwandte Themen