javafx:如何将禁用按钮与动态创建的复选框绑定?

时间:2018-07-07 17:21:35

标签: javafx

我想将按钮的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);
    }
}

有什么建议吗?谢谢

2 个答案:

答案 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);
}