【问题标题】:Restrict checkboxes checked. Javafx限制选中的复选框。 Javafx
【发布时间】:2018-07-28 06:14:03
【问题描述】:

如何限制用户可以选择的复选框数量?我想让它让用户只能选择 3。我想我应该使用 isSelected,但我不知道如何链接所有复选框。

    CheckBox cb1 = new CheckBox("Pepperoni");
    CheckBox cb2 = new CheckBox("Cheese");
    CheckBox cb3 = new CheckBox("Tomato");
    CheckBox cb4 = new CheckBox("Olives");
    CheckBox cb5 = new CheckBox("Chicken");
    //if 3 are already selected, it should not be possible for the user to select more

【问题讨论】:

标签: javafx checkbox


【解决方案1】:

只需使用合适的数据结构跟踪选定的CheckBoxes(LinkedHashSet 将允许您使用Set 功能并允许您确定插入的第一个)。
可以从侦听器更新数据结构到CheckBoxes 的selected 属性。

@Override
public void start(Stage primaryStage) throws Exception {
    String[] ingredients = new String[]{
        "Pepperoni",
        "Cheese",
        "Tomato",
        "Olives",
        "Chicken"
    };
    final int maxCount = 3;
    final Set<CheckBox> activeBoxes = new LinkedHashSet<>();

    ChangeListener<Boolean> listener = (o, oldValue, newValue) -> {
        // get checkbox containing property
        CheckBox cb = (CheckBox) ((ReadOnlyProperty) o).getBean();

        if (newValue) {
            activeBoxes.add(cb);
            if (activeBoxes.size() > maxCount) {
                // get first checkbox to be activated
                cb = activeBoxes.iterator().next();

                // unselect; change listener will remove
                cb.setSelected(false);
            }
        } else {
            activeBoxes.remove(cb);
        }
    };

    VBox root = new VBox();

    // create checkboxes
    for (int i = 0; i < ingredients.length; i++) {
        CheckBox cb = new CheckBox(ingredients[i]);
        cb.selectedProperty().addListener(listener);
        root.getChildren().add(cb);
    }

    Scene scene = new Scene(root);
    primaryStage.setScene(scene);
    primaryStage.show();
}

注意:如果您希望用户在选择 3 个时无法选择更多 CheckBoxes,只需在选择 3 个 CheckBox 时禁用所有未选择的 CheckBoxes es:

final CheckBox[] checkBoxes = new CheckBox[ingredients.length];

ChangeListener<Boolean> listener = new ChangeListener<Boolean>() {

    private int activeCount = 0;

    public void changed(ObservableValue<? extends Boolean> o, Boolean oldValue, Boolean newValue) {
        if (newValue) {
            activeCount++;
            if (activeCount == maxCount) {
                // disable unselected CheckBoxes
                for (CheckBox cb : checkBoxes) {
                    if (!cb.isSelected()) {
                        cb.setDisable(true);
                    }
                }
            }
        } else {
            if (activeCount == maxCount) {
                // reenable CheckBoxes
                for (CheckBox cb : checkBoxes) {
                    cb.setDisable(false);
                }
            }
            activeCount--;
        }
    }
};

VBox root = new VBox();

// create checkboxes
for (int i = 0; i < ingredients.length; i++) {
    CheckBox cb = new CheckBox(ingredients[i]);
    cb.selectedProperty().addListener(listener);
    root.getChildren().add(cb);
    checkBoxes[i] = cb;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2018-11-30
    • 2018-01-12
    相关资源
    最近更新 更多