如何在用户提交之前的必填字段之前禁用 TextField

How to disable a TextField until the user has submitted the previous required field

我正在做一个项目,其中包括添加客户信息。

我有四个 TextField,希望用来从用户那里获取客户信息。

我想禁用每个 TextField,直到用户提交前一个必填字段。我该怎么做?

我尝试对其中一个文本字段执行此操作,但没有成功且不完整:

TextField idTF = new TextField();
TextField nameTF = new TextField();
if (idTF.getText().isEmpty()) 
    nameTF.disableProperty();
TextField addressTF = new TextField();
TextField mobileTF = new TextField();

如@MadProgrammer 所述,您可以将侦听器添加到每个 TextField 的 textProperty,然后 off/on 禁用另一个 textField 的 属性,或者您可以在依赖字段。

BooleanBinding 可以创建如下:

textField2.disableProperty().bind(
                    Bindings.createBooleanBinding(() -> textField1.isDisable() || textField1.getText() == null || textField1.getText().isEmpty(),
                            textField1.textProperty(), textField1.disableProperty()));

下面是完整的工作示例。

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TextFieldDemo extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        StackPane root = new StackPane();
        root.setPadding(new Insets(10));
        Scene scene = new Scene(root, 320, 300);
        primaryStage.setScene(scene);
        primaryStage.setTitle("TextField Demo");
        primaryStage.show();

        TextField tf1 = new TextField();
        TextField tf2 = new TextField();
        TextField tf3 = new TextField();
        TextField tf4 = new TextField();
        Button submitBtn = new Button("Submit");
        addBinding(submitBtn, tf1, tf2, tf3, tf4);
        VBox pane = new VBox(tf1, tf2, tf3, tf4, submitBtn);
        pane.setSpacing(10);
        root.getChildren().add(pane);
    }

    private void addBinding(Button submitBtn, TextField... textFields) {
        for (int i = 0; i < textFields.length; i++) {
            TextField tf = textFields[i];
            Node node = i == textFields.length - 1 ? submitBtn : textFields[i + 1];
            node.disableProperty().bind(
                    Bindings.createBooleanBinding(() -> tf.isDisable() || tf.getText() == null || tf.getText().isEmpty(),
                            tf.textProperty(), tf.disableProperty()));
        }
    }
}