2010-05-22 44 views
1

我对Java很陌生,并且在UI上有一些问题循环通过JCheckBoxes。这个想法是,我有一堆复选框(不在一个组中,因为可以选择多个复选框。)当我单击一个JButton时,我想创建一个包含每个选中复选框的文本的字符串。我遇到的问题是,我们的教师告诉我们,复选框需要通过方法创建,这意味着(请参​​阅下面的代码)没有每个复选框的离散实例名称。如果有的话,我可以说像如何获取所有JCheckBox对象的句柄以便循环?

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"); 

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

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

+0

@ALL responders - 我只能选择一个答案来标记已接受,但所有这些答案都有帮助。谢谢! – EmmyS 2010-05-23 01:09:09

回答

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 
    } 
} 
+0

不,我可以稍微改变它(即添加新功能),只要我不删除任何现有的代码。 – EmmyS 2010-05-23 00:52:16

+0

谢谢,你的解决方案工作。我假设您提供获取选定选项的方式的CheckBoxPanel类的“真实世界”方式与aioobe的响应相似。我确实尝试过,但得到了Eclipse错误,我无法弄清楚如何摆脱。 (请参阅我对该答案的评论。) – EmmyS 2010-05-23 01:10:59

+0

我有一个名为RadioButtonPanel的第二个类,它具有所选选项的getter方法(其正文仅返回group.getSelection()。getActionCommand(),其中group是一个ButtonGroup )。我假设你的意思是在CheckBoxPanel中应该有类似的东西。但我不确定这是如何工作的 - 单选按钮很简单,因为一次只能选择一个; getSelection方法不适用于复选框,因为它们不是组的一部分(在这种情况下,无论如何,因为我们需要能够选择倍数)。 – EmmyS 2010-05-23 01:18:34

1

我建议你保持一个复选框列表:

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

之前add(b)做:

checkboxes.add(b); 

然后,您可以通过使用中的按钮操作码复选框列表迭代“ for-each“loop构造:

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

我会给你一个镜头 - 谢谢。 – EmmyS 2010-05-22 22:10:33

+0

好的,我将List和checkboxes.add(b)添加到包含创建按钮代码(CheckBoxPanel.java)的.java文件中。但是,动作侦听器位于不同的java文件中,并且当我尝试添加循环时,for line - for(JCheckBox cb:checkboxes) - 告诉我复选框无法解析。这两个文件位于同一个包中,而CheckBoxPanel类是一个公共类,但我显然无法访问其他.java文件中的复选框变量。帮帮我! – EmmyS 2010-05-22 22:18:49

0

我建议你不要把每一个List的复选框,当你创建它们。相反,在您的共享ActionListener中,您维护所有选定复选框的Set。使用ActionEvent上的getSource方法来确定用户选择了哪个复选框,然后将其转换为JCheckBox。如果​​对有问题的物品返回true,则尝试将其添加到您的selectedItemsSet。如果不是,则尝试删除它。

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

+0

如果我正确理解你,这意味着每个复选框都需要具有动作侦听器,并且只要该复选框被选中或未选中,动作就会被评估。这正是我们被告知不做的事情。不一定是因为这是错误的,或不好的做法,但这就是任务所在,我无法改变事情。我必须与我所得到的一起工作。这就是说,答案对未来的参考很有帮助,所以谢谢。 – EmmyS 2010-05-23 00:30:10

相关问题