所以我试图检查选中的复选框总数是否 == 10。如果是这样,我想禁用其余未选中的复选框!这意味着用户只能选择 10 个复选框。
我正在考虑一个 for 循环
,它循环遍历一个数组,然后检查是否选中了复选框,然后将 1 添加到计数器。如果计数器达到 10,我认为禁用其余复选框可能很容易,但显然不是!
List<Checkbox> chkSongs = new ArrayList<Checkbox>();
String labels[] = {"songA", "songB", "songC", "songD", "songE",
"songF", "songG", "songH", "songI", "songJ", "songK", "songL", "songM",
"songN", "songO", "songP", "songQ", "songR", "songS", "songT"}
for (int i = 0; i < labels.length; i++) {
Checkbox checkbox = new Checkbox(labels[i]);
chkSongs.add(checkbox);
formPanel.add(checkbox);
}
最佳答案
这是我临时写的,但我认为它可以满足您的要求:
public class CheckBoxFrame extends JFrame {
public CheckBoxFrame() throws HeadlessException {
JPanel formPanel = new JPanel(new GridLayout(-1, 4));
List<Checkbox> chkSongs = new ArrayList<>();
String labels[] = {"songA", "songB", "songC", "songD", "songE",
"songF", "songG", "songH", "songI", "songJ", "songK", "songL", "songM",
"songN", "songO", "songP", "songQ", "songR", "songS", "songT"};
for (String label : labels) {
Checkbox checkbox = new Checkbox(label);
chkSongs.add(checkbox);
formPanel.add(checkbox);
}
CheckBoxListener listener = new CheckBoxListener(chkSongs, 10);
setContentPane(formPanel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
}
public class CheckBoxListener implements ItemListener {
private int boxesChecked;
private final List<Checkbox> checkBoxes;
private final int maxSelections;
public CheckBoxListener(List<Checkbox> checkBoxes, int maxSelections) {
this.checkBoxes = new ArrayList<>(Objects.requireNonNull(checkBoxes));
this.maxSelections = maxSelections;
this.boxesChecked = (int) this.checkBoxes.stream().filter(cb -> cb.getState()).count();
this.checkBoxes.forEach(cb -> cb.addItemListener(this));
}
@Override
public void itemStateChanged(ItemEvent ie) {
if (ie.getStateChange() == ItemEvent.SELECTED) {
boxesChecked++;
} else {
boxesChecked--;
}
if (boxesChecked == maxSelections) {
checkBoxes.stream().filter(cb -> !cb.getState()).forEach(cb -> cb.setEnabled(false));
} else if (boxesChecked == maxSelections - 1) {
checkBoxes.stream().forEach(cb -> cb.setEnabled(true));
}
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new CheckBoxFrame().setVisible(true);
}
});
}
}
这仍然有其缺陷(例如,您可以将监听器添加到另一个复选框),但还不错。
关于java - 如何计算选中的复选框总数?如果(总共选择的)>10 则禁用休息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30641116/