【问题标题】:How to get a handle to all JCheckBox objects in order to loop?如何获取所有 JCheckBox 对象的句柄以便循环?
【发布时间】:2010-05-22 21:56:54
【问题描述】:

我对 Java 非常陌生,并且在 UI 上通过 JCheckBoxes 循环时遇到了一些问题。这个想法是我有一堆复选框(不在一个组中,因为可以选择多个。)当我单击 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");

所以我现在有一个面板,其中包含标题为“Each Topping $1.50”的边框和 7 个可见复选框。我需要做的是获取所有选定浇头的列表。我们不应该为每个复选框使用 ActionListener,而是在单击按钮时获取列表。我在这里真的很无能为力,但是当各个复选框没有实例名称时,我只是不知道如何获取复选框的 isSelected 属性。

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

【问题讨论】:

  • @ALL 响应者 - 我只能选择一个答案来标记为已接受,但他们都很有帮助。谢谢!

标签: java swing


【解决方案1】:

我假设您根本不允许更改 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
  }
}

【讨论】:

  • 不,只要不删除任何现有代码,我可以对其进行一些更改(即添加新功能)。
  • 谢谢,您的解决方案有效。我假设 CheckBoxPanel 类的“真实世界”方式提供了一种获取选定选项的方式,类似于 aioobe 的响应。我确实尝试过,但是遇到了一个 Eclipse 错误,我无法弄清楚如何摆脱它。 (请参阅我对该答案的评论。)
  • 我有一个名为 RadioButtonPanel 的第二个类,它确实有一个用于选定选项的 getter 方法(其主体只是返回 group.getSelection().getActionCommand(),其中 group 是一个 ButtonGroup)。我假设您的意思是 CheckBoxPanel 中应该有类似的东西。不过,我不确定这将如何工作 - 单选按钮很简单,因为一次只能选择一个; getSelection 方法不适用于复选框,因为它们不是组的一部分(在这种情况下,无论如何,因为我们需要能够选择多个。)
  • aioobe 的响应对于“真实世界”的解决方案会更好 - 在创建复选框时保留对复选框的引用,如第一个代码块中所述。然后提供一个 getSelectedOptions() 方法,该方法通过复选框旋转并构建选定选项的列表,如第二个代码块中所述。
  • 所以它是两者的结合 - 使用 aioobe 的解决方案将复选框添加到数组(或列表),然后使用您在 CheckBoxPanel 类中创建 getter 方法的建议来获取值。那应该消除我收到的错误(我希望!)谢谢。经过 13 年的程序化编程,这 OO 的东西让我大吃一惊!
【解决方案2】:

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

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())
        ....

【讨论】:

  • 好的,我将 List 和 checkboxes.add(b) 添加到包含创建按钮代码 (CheckBoxPanel.java) 的 .java 文件中。但是,动作侦听器位于不同的 java 文件中,当我尝试添加循环时,for 行 - for (JCheckBox cb : checkboxes) - 告诉我无法解析复选框。这两个文件在同一个包中,并且 CheckBoxPanel 类是一个公共类,但我显然无法访问我的其他 .java 文件中的 checkboxes 变量。救命!
【解决方案3】:

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

然后,您可以遍历所有项目的子集(仅那些被选中的项目)并将它们打印到控制台。

【讨论】:

  • 如果我的理解正确,这意味着每个复选框都需要有动作侦听器,并且只要选中或取消选中该框,就会评估动作。这正是我们被告知不要做的事情。不一定是因为它是错误的,或者是不好的做法,但这就是任务的内容,我无法改变。我必须用我得到的东西工作。也就是说,这个答案对以后的参考很有帮助,所以谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-04-25
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 2021-11-05
相关资源
最近更新 更多