2011-05-27 80 views
1

1)在以下方法(actionListener)中,用戶從JComboBox中選擇一個等級(例如A-F)。幫助實現JComboBox [] Listener

2)有多個JComboBoxes,每個選擇都被存儲到一個String []數組中。

問題: 這裏是兩難,如果用戶返回並改變從一個隨機的JComboBox做出選擇之前的等級選擇不會在陣列中被替換,但取得了新的選擇被存儲在接下來的數組索引。

如何讓程序取代以前的成績選擇,而不是隻添加新的選擇?

相關變量:

int counter; 
private JComboBox[] gradeField; 
//grade.userGrades[] is array of grades taken from selected combo boxes     

的動作監聽匿名類:

gradeField[counter].addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       Object holder = e.getSource(); 
       JComboBox tempGradeBox = (JComboBox)holder; 
       String theGrade = (String)tempGradeBox.getSelectedItem(); 
       grade.userGrades[grade.getNext()] = theGrade; 
       grade.updateNext(); 
      }      
     }); 

預先感謝任何幫助。

+0

你的問題對我來說還不夠清楚,你能否詳細解釋一下? – MByD 2011-05-27 16:10:38

+0

對不起, 一旦有人從組合框中選擇了一個等級,我將數據保存在一個數組中並增加索引,但是如果我改變了組合框的等級,由於getNext方法,我得到了一個超出界限的錯誤。我不想添加新的成績,如果用戶已經從該組合框中選擇了一些東西,我想要替換成績。 – RandellK02 2011-05-27 16:31:07

回答

1

更新用戶級是相同的指數組合框:

final int index = counter; 
    gradeField[counter].addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      Object holder = e.getSource(); 
      JComboBox tempGradeBox = (JComboBox)holder; 
      String theGrade = (String)tempGradeBox.getSelectedItem(); 
      grade.userGrades[index] = theGrade; 
     }      
    }); 
+0

感謝您的提示!幫助我極大地:) – RandellK02 2011-05-27 19:23:30

3

我保存年級的數組和增量索引,

那麼你不應該增加索引。這假定用戶按順序從組合框中選擇等級。正如你發現用戶經常可以隨機工作。

相反,您需要知道哪個組合框已更改,然後更新數組中的相應條目。

或者不同的解決方案可能是在最後更新您的數組。所以也許你有一個「處理結果」按鈕。然後你可以順序循環所有的組合框來獲得選定的值。

+0

感謝您的幫助。下次我會用你的想法。 – RandellK02 2011-05-27 19:24:35

1

這裏的JB Nizet的回答的另一個變化:

class OuterClass 
{ 
... 

gradeField[counter].addActionListener(new GradeSettingActionListener(counter)); 

... 
class GradeSettingActionListener implements ActionListener 
{ 
    // -- Doesn't have to be final here (it does in JB's answer), but I like to be restrictive. 
    private final int index; 

    public GradeSettingActionListener(int index) 
    { 
    this.index = index; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
    Object holder = e.getSource(); 
    JComboBox tempGradeBox = (JComboBox) holder; 
    String theGrade = (String) tempGradeBox.getSelectedItem(); 
    grade.userGrades[index] = theGrade; 
    } 
} 
} 

這種方法通過增加內刪除匿名類類。內部班級仍然可以訪問grade。除非你有機會在晚些時候分開內部課程,否則你在這裏獲益不多。

當然,根據其他要求(即,在將等級存儲在陣列中之後是否進行額外的處理,似乎可能),camickr一次處理所有等級的建議也可以是有效的。

+0

感謝您的幫助。這是很好的信息,因爲有時我不喜歡使用匿名類,如果我可以使內部類更有意義。 – RandellK02 2011-05-27 19:27:26