簡體   English   中英

TextField和屬性之間的JavaFX綁定

[英]JavaFX binding between TextField and a property

如果在JavaFX TextField和屬性之間創建綁定,則每次擊鍵時此綁定都將失效,從而導致對文本進行更改。

如果您有一系列綁定,則默認行為可能會導致問題,因為在編輯中間值可能無效。

好的,我知道我可以創建從屬性到文本字段的單向綁定,並注冊一個更改偵聽器,以便在光標離開字段時獲取通知,並在必要時手動更新屬性。

是否有一種簡單,優雅的方法來更改此行為,以便綁定僅在編輯完成時失效,例如當光標離開字段時?

謝謝

我認為你已經描述了唯一的方法。 這是關於我可以看到實現它的最簡潔方法(使用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);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM