martin_dk
martin_dk

Reputation: 505

JavaFX bind to multiple properties

I have a simple fxml with a textfield and a button. I'd like to have the button disabled if the textfield is empty. So I insert something like the following in my controller:

@Override
public void initialize(URL url, ResourceBundle bundle) {
  button.disableProperty().bind(textField.textProperty().isEqualTo(""));
}

..and that works fine. The problem is when I add a second textfield and would like my button to be disabled if either textfield is empty. What to do then? I tried the following, but that doesn't work:

@Override
public void initialize(URL url, ResourceBundle bundle) {
  button.disableProperty().bind(textField.textProperty().isEqualTo(""));
  button.disableProperty().bind(textField2.textProperty().isEqualTo(""));
}

Upvotes: 18

Views: 19968

Answers (4)

Denis Terentyev
Denis Terentyev

Reputation: 11

Better way for case with 2+ properties:

button.disableProperty().bind(
    Stream.of(
                        textField,
                        textField2
                ) // or any <collection>.stream()
                .map(TextField::textProperty)
                .map(StringProperty::isEmpty)
                .reduce(Bindings::and)
);

Upvotes: 1

Korvin Gump
Korvin Gump

Reputation: 393

In addition to martin_dk answer, if you want to bind more than two properties you will get code like below, looks weird, but it works.

BooleanBinding booleanBinding
        = finalEditor.selectedProperty().or(
                staticEditor.selectedProperty().or(
                        syncEditor.selectedProperty().or(
                                nativeEditor.selectedProperty().or(
                                        strictEditor.selectedProperty()))));

abstractEditor.disableProperty ().bind(booleanBinding);

Upvotes: 5

martin_dk
martin_dk

Reputation: 505

In addition to Andreys approach, I found that you can also do it like this:

    BooleanBinding booleanBinding = 
      textField.textProperty().isEqualTo("").or(
        textField2.textProperty().isEqualTo(""));

    button.disableProperty().bind(booleanBinding);

Upvotes: 9

Andrey Chaschev
Andrey Chaschev

Reputation: 16526

This is possible by binding to a boolean expression via Bindings:

button.disableProperty().bind(
    Bindings.and(
        textField.textProperty().isEqualTo(""),
        textField2.textProperty().isEqualTo("")));

Upvotes: 28

Related Questions