1)在下面的方法(actionListener)中,用户从JComboBox中选择一个等级(例如A-F)。
2)有多个JComboBox,每个选择都存储在一个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 :(得分:3)
我将等级保存在数组中并递增索引
嗯,你不应该增加索引。这假定用户按顺序从组合框中选择等级。正如您所发现的,用户通常可以随机工作。
相反,您需要知道哪个组合框已更改,然后更新阵列中的相应条目。
或者另一种解决方案可能是在最后更新您的阵列。所以也许你有一个“过程结果”按钮。然后,您可以连续循环遍历所有组合框以获取所选值。
答案 1 :(得分: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;
}
});
答案 2 :(得分: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建议立即处理所有等级也可能是有效的,这取决于其他要求(即,在等级存储在阵列中之后是否进行了额外的处理,这似乎很可能)。