Помогите реализовать JComboBox [] Listener - PullRequest
1 голос
/ 27 мая 2011

1) В следующем методе (actionListener) пользователь выбирает оценку (например, A-F) из JComboBox.

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 ]

3 голосов
/ 27 мая 2011

Я сохраняю оценку в массиве и увеличиваю индекс,

Ну, вы не должны увеличивать индекс. Это предполагает, что пользователь выбирает оценки в поле со списком в последовательном порядке. Как вы обнаружили, пользователи часто могут работать случайным образом.

Вместо этого вам нужно знать, какое поле со списком было изменено, а затем обновить соответствующую запись в вашем массиве.

Или другое решение - обновить массив в конце. Так что, возможно, у вас есть кнопка «Результаты процесса». Затем вы можете последовательно просмотреть все поля со списком, чтобы получить выбранное значение.

1 голос
/ 27 мая 2011

Вот еще один вариант ответа Дж. Б. Низета:

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 обрабатывать все оценки одновременно также может быть действительным, в зависимости от других требований (то есть, выполняется ли дополнительная обработка после сохранения оценок в массиве, что представляется вероятным).

1 голос
/ 27 мая 2011

Обновить оценку пользователя с индексом, совпадающим с полем со списком:

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