gpt4 book ai didi

TextField 和属性之间的 JavaFX 绑定(bind)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:24:47 26 4
gpt4 key购买 nike

如果您在 JavaFX TextField 和属性之间创建绑定(bind),则此绑定(bind)在每次击键时都会失效,这会导致文本发生更改。

如果您有一个绑定(bind)链,默认行为可能会导致问题,因为在编辑过程中值可能无效。

好的,我知道我可以创建一个从属性到文本字段的单向绑定(bind),并注册一个更改监听器以在光标离开该字段时收到通知,并在必要时手动更新属性。

是否有一种简单、优雅的方法来更改此行为,以便绑定(bind)仅在编辑完成时失效,例如光标何时离开该字段?

谢谢

最佳答案

我认为您已经大致描述了唯一的方法。这是我能看到的最干净的实现方式(使用 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);
}
}

关于TextField 和属性之间的 JavaFX 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23058980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com