En mi aplicación tengo una pantalla con tres campos que necesito validar y un botón Guardar.
Enlazo el botón Guardar "deshabilitar propiedad" a la "propiedad de texto" de los campos que coincide con algún patrón (patrones simplificados en este ejemplo, no importa):
public void initialize(){ saveNetworkBtn.disableProperty() .bind(textPropertyBindingPattern(ipInp, Pattern.compile("[0-9]{3}")) .or(textPropertyBindingPattern(subnetInp, Pattern.compile("[0-9]{3}"))) .or(textPropertyBindingPattern(gatewayInp, Pattern.compile("[0-9]{3}")))); } private BooleanBinding textPropertyBindingPattern(TextField textField, Pattern pattern ) { return Bindings.createBooleanBinding(() -> !pattern.matcher(textField.getText()).matches(), textField.textProperty()); } Entonces ese botón de guardar está bloqueado hasta que todos los valores sean correctos: 
Pero necesito resaltar los campos incorrectos también con un borde rojo como
-fx-border-color: red;Mi objetivo principal es manejar esto en un solo lugar en lugar de agregar varios oyentes. ¿Es posible hacer esto de alguna manera en el código anterior o necesito agregar oyentes a cada campo?
Resuelto agregando un oyente al enlace, que agrega un estilo al campo de texto recibido:
private BooleanBinding textPropertyBindingPattern(TextField textField, Pattern pattern) { BooleanBinding binding = Bindings.createBooleanBinding(() -> !pattern.matcher(textField.getText()).matches(), textField.textProperty()); applyValidationClass(textField, binding.get()); binding.addListener((obs, oldValue, newValue) -> { applyValidationClass(textField, newValue); }); return binding ; } private void applyValidationClass(TextField textField, boolean isInvalid) { textField.pseudoClassStateChanged(PseudoClass.getPseudoClass("incorrect-value"), isInvalid); }y 'valor incorrecto' descrito en el archivo CSS:
TextField:incorrect-value { -fx-border-color: red; }Visualización: https://www.screencast.com/t/4NKEjjopvaE7