3

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

编辑:

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

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

      }
  }

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

4

4 回答 4

6

一种方法:将所有 JCheckBoxes 放在一个数组中,或者ArrayList<JCheckBox>在需要时简单地遍历列表以查看选中了哪些复选框。

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

于 2012-04-06T14:52:33.433 回答
2

我的建议(也许不是最好的)是将所有选中的 CheckBox 保留在列表中。

因此,所有 JCheckBoxex 的侦听器将是这样的:

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

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

问候。

于 2012-04-06T14:55:48.590 回答
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--;
    }

} 
}
于 2012-04-06T15:13:21.940 回答
1

为所有复选框添加“ActionPerformed”事件侦听器并在事件处理程序方法中调用此方法以获取选中复选框的数量:

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 应该返回您的主面板,哪些组件位于其上。

于 2012-04-06T15:23:58.960 回答