import javafx.application.Application; import javafx.beans.property.IntegerProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.scene.Scene; import javafx.scene.control.TextField; import javafx.scene.control.TextFormatter; import javafx.stage.Stage; import javafx.util.converter.IntegerStringConverter; public class JDK8132333 extends Application { public static void main(String[] args) { Application.launch(args); } private IntegerProperty modelProperty = new SimpleIntegerProperty(); @Override public void start(Stage stage) { TextField myTextField = new TextField(); Scene scene = new Scene(myTextField); stage.setScene(scene); stage.show(); myTextField.setTextFormatter(new TextFormatter(new IntegerStringConverter())); TextFormatter tf = (TextFormatter) myTextField.textFormatterProperty().get(); ObjectProperty guiProperty = tf.valueProperty(); guiProperty.bindBidirectional(this.modelProperty.asObject()); // <-- Model property now MUST always be the same as Gui property guiProperty.addListener((property, oldV, newV) -> System.out.printf("Gui value: " + newV)); this.modelProperty.addListener((property, oldV, newV) -> System.out.println("Model value: " + newV)); /* * Apparently model listener is NOT fired, but gui listener IS, when entering values into TextField. */ } }