'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(""));
}
Solution 1:[1]
This is possible by binding to a boolean expression via Bindings:
button.disableProperty().bind(
Bindings.and(
textField.textProperty().isEqualTo(""),
textField2.textProperty().isEqualTo("")));
Solution 2:[2]
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);
Solution 3:[3]
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);
Solution 4:[4]
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)
);
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Andrey Chaschev |
| Solution 2 | martin_dk |
| Solution 3 | Korvin Gump |
| Solution 4 | Denis Terentyev |
