有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何获得所有JCheckBox对象的句柄以进行循环?

我对Java非常陌生,在UI上通过JCheckbox循环时遇到一些问题。我的想法是,我有一堆复选框(不在一个组中,因为可以选择多个复选框。)单击JButton时,我想构建一个字符串,其中包含每个选中复选框中的文本。我遇到的问题是,我们的讲师告诉我们,复选框需要通过一个方法创建,这意味着(参见下面的代码)每个复选框都没有一个离散的实例名称。如果有的话,我可以说

if(checkBox1.isSelected()) {
  myString.append(checkBox.getText());
}

这将对checkBox2、checkBox3等重复。但是提供给我们的向面板添加复选框的方法如下所示:

public class CheckBoxPanel extends JPanel {
private static final long serialVersionUID = 1L;

public CheckBoxPanel(String title, String... options) {
    setBorder(BorderFactory.createTitledBorder(BorderFactory
            .createEtchedBorder(), title));
    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

    // make one checkbox for each option
    for (String option : options) {
        JCheckBox b = new JCheckBox(option);
        b.setActionCommand(option);
        add(b);
    }
}

}

这叫做:

toppingPanel = new CheckBoxPanel("Each Topping $1.50", "Tomato", "Green Pepper", 
                                    "Black Olives", "Mushrooms", "Extra Cheese",
                                    "Pepperoni", "Sausage");

因此,我现在有一个面板,其中包含一个标题为“每个顶级$1.50”的边框和7个可见复选框。我需要做的是得到一份所有选定配料的列表。我们不应该为每个复选框使用ActionListener,而是在单击按钮时获取列表。在这里,我感觉自己真的很无知,但我就是不知道如何在单个复选框没有实例名的情况下获取复选框的isSelected属性

理想情况下,我希望以某种方式将所有复选框添加到一个数组中,并在按钮的动作侦听器中通过该数组循环,以确定选中了哪些复选框,但如果我必须单独检查每个复选框,我会这样做。我只是不知道如何在动态创建单个复选框时引用它们


共 (3) 个答案

  1. # 1 楼答案

    我建议您维护一个复选框列表:

    List<JCheckBox> checkboxes = new ArrayList<JCheckBox>();
    

    add(b)之前:

    checkboxes.add(b);
    

    然后,您可以使用“for each”循环构造遍历按钮操作代码中的复选框列表:

    for (JCheckBox cb : checkboxes)
        if (cb.isSelected())
            process(cb.getText()); // or whatever.
    

    或者,如果您需要跟踪特定索引:

    for (int i = 0; i < checkboxes.size(); i++)
        if (checkboxes.get(i).isSelected())
            ....
    
  2. # 2 楼答案

    我假设你根本不被允许修改CheckBoxPanel代码。这似乎是一个无用的练习,因为在现实世界中,您可能会认为如果CheckBoxPanel向您提供了一个类(例如在库中),那么它将包括一种获取所选选项的方法。无论如何,由于限制,您可以这样做:

    for( int i=0; i<checkBoxPanel.getComponentCount(); i++ ) {
      JCheckBox checkBox = (JCheckBox)checkBoxPanel.getComponent( i );
      if( checkBox.isSelected() ) {
         String option = checkBox.getText();
         // append text, etc
      }
    }
    
  3. # 3 楼答案

    我建议您在创建复选框时不要将每个复选框都放在List中。相反,在共享的ActionListener中,维护所有选中复选框的Set。使用ActionEvent上的getSource方法确定用户选择的复选框,然后将其强制转换为JCheckBox。如果isSelected()为相关项返回true,请尝试将其添加到selectedItems{}中。如果不是,则尝试将其删除

    然后,您可以迭代所有项目的子集(仅选择的项目)并将它们打印到控制台