帮助实现JComboBox []监听器

时间:2011-05-27 15:59:19

标签: java jcombobox actionlistener

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();
            }                       
        });

提前感谢您的帮助。

3 个答案:

答案 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建议立即处理所有等级也可能是有效的,这取决于其他要求(即,在等级存储在阵列中之后是否进行了额外的处理,这似乎很可能)。