我有4个CheckBox
,用户可以选择全部或全部不选择。顺序很重要,因此有16种可能的不同组合。我希望有一个高效的函数,该函数可以读取CheckBox
es,并根据组合返回一个从0到15的值。 JavaFX中已经实现了什么吗?
编辑
我正在尝试实施@fabian的解决方案
private static int countSelectedCheck(CheckBox[] maskCheckBoxes){
// print binary
int value = 0;
for (int i = 0; i < maskCheckBoxes.length; i++) {
if (maskCheckBoxes[i].isSelected()) {
value += (1 << i);
}
}
System.out.println(value);
return value;
}
但是我遇到了例外。
答案 0 :(得分:1)
如果要以4位二进制数读取复选框状态,则有16种可能性。
如果您全部选择4个CheckBox
,并考虑选择顺序,则有4! = 24
种可能性。不选择任何一种是另一种可能性,并且如果您允许选择任意数量的CheckBox
,则将获得另外24个用于精确选择3个CheckBox
es和另外12个用于精确选择2个CheckBox
es和另外4个用于选择恰好1个CheckBox
总计为65 = 24 + 24 + 12 + 4 + 1
的对象。
保存选择顺序的最简单方法是将CheckBox
个e(或标识它们的值)存储在List
中。
下面的示例打印选择为二进制数的选择,并显示选择的顺序。
@Override
public void start(Stage primaryStage) throws IllegalAccessException {
VBox container = new VBox();
final List<CheckBox> selectionOrder = new ArrayList<>();
final int checkBoxCount = 4;
for (int i = 0; i < checkBoxCount; i++) {
final CheckBox cb = new CheckBox();
cb.setUserData(i);
cb.selectedProperty().addListener((o, oldValue, newValue) -> {
if (newValue) {
selectionOrder.add(cb);
} else {
selectionOrder.remove(cb);
}
});
container.getChildren().add(cb);
}
Button btn = new Button("print");
btn.setOnAction(evt -> {
System.out.println(selectionOrder.stream().map(c -> c.getUserData().toString()).collect(Collectors.joining(", ", "{ ", " }")));
// print binary
int value = 0;
for (CheckBox cb : selectionOrder) {
value |= (1 << ((Integer) cb.getUserData()));
}
System.out.println(value);
});
container.getChildren().add(btn);
Scene scene = new Scene(container);
primaryStage.setScene(scene);
primaryStage.show();
}
如果您实际上不需要选择的顺序,建议您删除列表,将监听器移至selected
属性,而不要设置userData
而是存储{{1} } CheckBox
中的es,您可以这样做
CheckBox[] array