1
votes

Comment désactiver le bouton si le TextField est vide?

Je ne peux pas désactiver mon bouton. Dans le code ci-dessous, accept est un Button et email est un TextField .

email.setOnAction(ae -> {
    if(!email.getText().isEmpty()) {
        accept.setDisable(false);
    } else
        accept.setDisable(true);
});

Cela ne fait rien si j'écris dans le champ de texte.


1 commentaires

onAction ne se déclenche que lorsque Entrée est pressé. Le comportement souhaité met-il potentiellement à jour l'état du bouton à chaque modification du texte TextField ? BTW: l'instruction if pourrait être facilement remplacée par accept.setDisable (email.getText (). IsEmpty ());


3 Réponses :


4
votes

Vous pouvez utiliser un simple BooleanBinding lié ​​au disabledProperty du Button . Cela prend seulement 2 lignes de code pour accomplir ceci:

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

public class BooleanBindingExample extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // Simple interface
        VBox root = new VBox(5);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        // TextField and Button
        TextField textField = new TextField();
        Button button = new Button("Click Me");
        root.getChildren().addAll(textField, button);

        // Create a BooleanBinding for the textField to hold whether it is null
        BooleanBinding isTextFieldEmpty = Bindings.isEmpty(textField.textProperty());

        // Now, bind the Button's disableProperty to that BooleanBinding
        button.disableProperty().bind(isTextFieldEmpty);

        // Show the Stage
        primaryStage.setWidth(300);
        primaryStage.setHeight(300);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

Vous pouvez utiliser le MCVE ci-dessous pour le voir en action:

BooleanBinding isTextFieldEmpty = Bindings.isEmpty(textField.textProperty());
button.disableProperty().bind(isTextFieldEmpty);


0 commentaires

5
votes

Suite à la réponse de Zephyr, vous pouvez le lier directement à l'intérieur de votre bouton:

button1.disableProperty().bind(
    Bindings.isEmpty(textField1.textProperty())
        .or(Bindings.isEmpty(textField2.textProperty()))
        .or(Bindings.isEmpty(textField3.textProperty()))
);

Ou si vous souhaitez désactiver un bouton lorsque plusieurs champs de texte sont vides:

button1.disableProperty().bind(Bindings.isEmpty(textField1.textProperty()));


0 commentaires

1
votes

Suite à la réponse de miKel , vous pouvez définir la propriété disable du bouton sans importer la classe Bindings :

button1.disableProperty().bind(
    textField1.textProperty().isEmpty() 
    .or(textField2.textProperty().isEmpty())
    .or(textField3.textProperty().isEmpty())
);


0 commentaires