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()) );
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 texteTextField
? BTW: l'instructionif
pourrait être facilement remplacée paraccept.setDisable (email.getText (). IsEmpty ());