如何计算JCheckboxes的数量?

时间:2012-04-06 14:46:44

标签: java swing jframe jcheckbox

我的JFrame中有11个不同的复选框,并且希望能够在检查完一个总数时检查一个数字。我知道如何设置一个ItemListener,看看是否有一个被检查,但我不知道如何检查所有这些..

编辑:

cblist是一个包含11个JCheckBoxes的ArrayList。我给每个JCheckBox一个项目监听器,这里是单击复选框时使用的类...

private class CheckClass implements ItemListener{
      public void itemStateChanged(ItemEvent event){
         for(cblist.isChecked){
             ingnum++;
         }

      }
  }

在for循环中,我如何测试ArrayList的所有元素..我现在理解我的语法不正确。

4 个答案:

答案 0 :(得分:6)

一种方法:将所有JCheckBox放在一个数组或ArrayList<JCheckBox>中,并在需要时,只需遍历列表即可查看选中的复选框。

另一种可能的解决方案:如果你有一个表格结构,使用一个在其模型中保存布尔值的JTable,然后在需要时迭代TableModel的行以查看哪些行包含Boolean.TRUE值。

答案 1 :(得分:2)

我的提议(可能不是最好的)是将所有选中的CheckBox保留在列表中。

所以对于所有JCheckBoxex的监听器都是这样的:

void stateChanged(ChangeEvent e){
    if( CheckBox is checked){
       // add the checkbox in the list.
    } else {
        // remove CheckBox in the list.
     }
}

要知道检查了多少个复选框,只需计算列表的大小。

问候。

答案 2 :(得分:2)

您可以保留全局计数器countChecked并制作框架implements ItemListener

表示框架JCheckBox中的所有chkBox.addItemListener(this)并处理事件

public class MyFrame extends JFrame implements ItemListener{

private int countChecked = 0;
private JPanel contentPane;
    public MyFrame() {
    contentPane = new JPanel();
    setContentPane(contentPane);
    JCheckBox chckbx = new JCheckBox("New check box");
    contentPane.add(chckbx, BorderLayout.CENTER);
    chckbx.addItemListener(this);
}

@Override
public void itemStateChanged(ItemEvent ie) {
    if(ie.getSource().getClass() == JCheckBox.class)
    {
        if(ie.getStateChange() == ie.SELECTED)
            countChecked++;
        else if(ie.getStateChange() == ie.DESELECTED)
            countChecked--;
    }

} 
}

答案 3 :(得分:1)

添加&#34; ActionPerformed&#34;所有复选框的事件监听器&amp;在事件处理程序方法中调用此方法以获取已检查复选框的数量:

int countCheckedCheckBoxes(){
    Component[] cs = getRootPane().getComponents();
    int checkNums = 0;
    for(Component c : cs){
        if(c instanceof JCheckBox){
            if(((JCheckBox)c).isSelected()){
                checkNums++;
            }
        }
    }
    return checkNums;
}

getRootPane应该返回主面板上的组件。