Было бы 16 возможностей, если вы хотите прочитать состояния флажка как двоичное число с 4 цифрами.
Если вы выберете все 4 CheckBox
и рассмотрите порядок выбора, вы получите 4! = 24
возможностей. Выбор «нет» - еще одна возможность, и если вы позволите выбрать произвольное число CheckBox
es, вы получите еще 24 для выбора точно 3 CheckBox
es и еще 12 для выбора ровно 2 CheckBox
es и еще 4 для выбора точно 1 CheckBox
суммирование до 65 = 24 + 24 + 12 + 4 + 1
.
Самым простым решением для сохранения порядка выбора было бы сохранение CheckBox
es (или их значений) в 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
, а вместо этого хранить CheckBox
в * 1022. * что позволяет делать
int value = 0;
for (int i = 0; i < array.length; i++) {
if (array[i].isSelected()) {
value |= (1 << i);
}
}