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.
3 Réponses :
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);
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()));
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())
);
onActionne se déclenche que lorsque Entrée est pressé. Le comportement souhaité met-il potentiellement à jour l'état du bouton à chaque modification du texteTextField? BTW: l'instructionifpourrait être facilement remplacée paraccept.setDisable (email.getText (). IsEmpty ());