如果您在 JavaFX TextField 和属性之间创建绑定,则每次击键时该绑定都会失效,从而导致文本发生更改。
如果您有一系列绑定,则默认行为可能会导致问题,因为中间的编辑值可能无效。
好的,我知道我可以创建从属性到文本字段的单向绑定,并注册一个更改监听器,以便在光标离开字段时收到通知,并在必要时手动更新属性。
是否有一种简单、优雅的方法来更改此行为,以便绑定仅在编辑完成时才失效,例如当光标离开该字段时?
Thanks
我认为您已经描述了唯一的方法。以下是我能看到的最简洁的实现方法(使用 Java 8,不过如果需要,可以很容易地将 lambda 转换回 JavaFX 2.2 兼容):
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.StringBinding;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class CommitBoundTextField extends Application {
@Override
public void start(Stage primaryStage) {
TextField tf1 = new TextField();
createCommitBinding(tf1).addListener((obs, oldText, newText) ->
System.out.printf("Text 1 changed from \"%s\" to \"%s\"%n", oldText, newText));
TextField tf2 = new TextField();
createCommitBinding(tf2).addListener((obs, oldText, newText) ->
System.out.printf("Text 2 changed from \"%s\" to \"%s\"%n", oldText, newText));
VBox root = new VBox(5, tf1, tf2);
Scene scene = new Scene(root, 250, 100);
primaryStage.setScene(scene);
primaryStage.show();
}
private StringBinding createCommitBinding(TextField textField) {
StringBinding binding = Bindings.createStringBinding(() -> textField.getText());
textField.addEventHandler(ActionEvent.ACTION, evt -> binding.invalidate());
textField.focusedProperty().addListener((obs, wasFocused, isFocused)-> {
if (! isFocused) binding.invalidate();
});
return binding ;
}
public static void main(String[] args) {
launch(args);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)