2010-05-22 54 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