我想将按钮的disable
与动态创建的复选框绑定在一起。如果选中了一个复选框,则应启用Button
。
这是我的代码
public class DietTabPageController {
@FXML
private FlowPane parent;
@FXML
private Button okButton;
private ObservableList<CheckBox> checkBoxes=FXCollections.observableArrayList();
@FXML
private void initialize() {
ObservableList<Diet> diets = DietDAO.getDiets();
diets.forEach(diet -> checkBoxes.add(new CheckBox(diet.getName())));
//checkboxes added in parent Flowpane
parent.getChildren().addAll(checkBoxes);
}
}
有什么建议吗?谢谢
答案 0 :(得分:0)
您需要将侦听器添加到selected
的所有CheckBox
属性中。每次更改属性之一时,如有必要,请修改Button
的{{1}}属性。顺便说一句:使disable
可观察似乎没有必要:
checkBoxes
答案 1 :(得分:0)
您可以使用JavaFX非常好的Bindings
类!
试试这个:
okButton.disableProperty().bind(
Bindings.createBooleanBinding(
()->!checkBoxes.stream().anyMatch(CheckBox::isSelected),
checkBoxes.stream().map(x->x.selectedProperty()).toArray(Observable[]::new)
)
);
这将创建一个新的Binding,它将在每个复选框上侦听,然后调用给定的函数来计算属性的值。 此处的其他阅读内容:Bindings
关于您的评论: 我不知道您可以编辑Diet类的多少,但是,如果可以的话,有一种非常简单的方法来显示复选框并添加按钮绑定。看下面的示例:
ListView<Diet> dietsView = new ListView<>(diets);
dietsView.setCellFactory(CheckBoxListCell.forListView(diet ->
diet.selectedProperty()));
btn.disableProperty().bind(
Bindings.createBooleanBinding(
() -> !diets.stream().anyMatch(diet->diet.isSelected()),
diets.stream().map(x->x.selectedProperty())
.toArray(Observable[]::new)
)
);
将此添加到Diet类:
private final BooleanProperty selected = new SimpleBooleanProperty();
public final BooleanProperty selectedProperty() {
return this.selected;
}
public final boolean isSelected() {
return this.selectedProperty().get();
}
public final void setSelected(final boolean on) {
this.selectedProperty().set(on);
}