1

我在 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>
4

3 回答 3

4

这是什么”?JFrame? 如果是这样,您将了解,您将通过该搜索获得的唯一直接位于 JFrame 上的组件是 contentPane,并且您的 JCheckBoxes 在组件层次结构中可能比您正在查找的位置更深。

为什么不让自己更轻松,将 JCheckBoxes 放在一个集合中,例如 ArrayList。或者,如果数量很少,请使用它们的变量名。

于 2012-01-31T22:18:31.437 回答
3

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

但这种方法并不是那么好。您需要记住复选框,以便您可以轻松查询它们的状态,或者您应该使用模型,以防JCheckBox它可能ButtonModel会改变保存相关数据的合适数据结构的状态。

于 2012-01-31T22:21:17.217 回答
3

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

于 2012-01-31T22:29:39.893 回答