如何检查JFrame中选中的复选框?

时间:2012-01-31 21:45:26

标签: java swing jframe jcheckbox

我在JForm(SubComponents)中有几个复选框,我正在使用此代码来检查哪一个被检查:

countItems = 0;
    for(Component jb: this.getComponents())
    {
        if((jb instanceof JCheckBox) ) //I never get pass this point(its always false)
        {   
            JCheckBox chbox = (JCheckBox)jb;
            if(chbox.isSelected())
            countItems++;
        }
    }

有谁知道问题是什么?

谢谢

编辑:这是xml:

<Form version="" maxVersion"" type="">
   <AuxValues>
   </AuxValues>
   <Layout>
   </Layout>
   <SubComponents>
     <Component class="javax.swing.JCheckBox" name="jCheckBox1">
       <Properties>
         <Property name="text" type="java.lang.String" value="Cheese"/>
       </Properties>
     </Component>
     <Component class="javax.swing.JCheckBox" name="jCheckBox2">
       <Properties>
         <Property name="text" type="java.lang.String" value="Sausage"/>
       </Properties>
     </Component>
     <Component class="javax.swing.JCheckBox" name="jCheckBox3">
       <Properties>
         <Property name="text" type="java.lang.String" value="Pepperoni"/>
       </Properties>
     </Component>
     <Component class="javax.swing.JCheckBox" name="jCheckBox4">
       <Properties>
         <Property name="text" type="java.lang.String" value="Mushroom"/>
       </Properties>
     </Component>
  </SubComponents>
</Form>

3 个答案:

答案 0 :(得分:4)

什么是“这个”? JFrame?如果是这样,您了解直接在JFrame上使用该搜索获得的唯一组件是contentPane,并且您的JCheckBox可能在组件层次结构中比您正在查看的更深。

为什么不让自己更容易,并将JCheckBox放在一个集合中,例如ArrayList。或者如果数量很少,请使用其变量名称。

答案 1 :(得分:3)

由于您没有显示表单的创建(什么是JForm,顺便说一句?),我最好的猜测是复选框不是this的子项,而是某些面板或其他容器这本身就是this的孩子。如果你想按照你的方法迭代所有组件,你需要递归地执行它,即if (jb instancof Container) <iterate over children>

但这种方法并不是那么好。您需要记住复选框,以便您可以轻松查询其状态,或者您应该使用模型,在JCheckBox的情况下,ButtonModel可能会改变包含您的状态的拟合数据结构相关数据。

答案 2 :(得分:3)

也许您的复选框位于另一个容器(如JPanel)中,在这种情况下,您应该在容器组件上调用getcomponents,否则您可以创建一个在jframe中找到另一个容器组件时递归调用的方法,这样您就可以遍历所有等级...