2011-05-27 1 views
1

1) Dans la méthode suivante (actionListener), un utilisateur sélectionne une note (par exemple A-F) d'un JComboBox.Aide à l'implémentation de JComboBox [] Listener

2) Il y a plusieurs JComboBox, et chaque sélection faite est stockée dans un seul tableau String [].

PROBLÈME: Voici le dilemme, si un utilisateur revient en arrière et modifie une sélection faite à partir d'un JComboBox aléatoire, la sélection de grade précédente ne sera pas remplacée dans le tableau, mais la nouvelle sélection est stockée à l'index de tableau suivant .

Comment puis-je faire en sorte que le programme remplace la sélection de notes précédente et ne pas simplement ajouter la nouvelle sélection?

variables pertinentes:

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

action Listener classe anonyme:

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

Merci à l'avance pour toute aide.

+0

Votre question n'est pas assez claire pour moi, pourriez-vous s'il vous plaît expliquer plus? – MByD

+0

Désolée pour toute imprécision, Une fois que quelqu'un sélectionne une note de la comboBox, j'enregistre la note dans un tableau et incrémente l'index, mais si je change de note dans la combo, je reçois une erreur en raison de la méthode getNext. Je ne veux pas ajouter la nouvelle note si l'utilisateur a déjà sélectionné quelque chose de cette zone de liste déroulante, je veux remplacer ce que la note. – RandellK02

Répondre

1

Mise à jour le grade utilisateur étant au même indice que la zone de liste déroulante:

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

Merci pour votre conseil! M'a beaucoup aidé :) – RandellK02

3

-je enregistrer la note dans un tableau et incrémenter l'indice,

Eh bien vous ne devriez pas être incrémentant l'indice. Cela suppose que l'utilisateur sélectionne les notes de la zone de liste déroulante dans un ordre séquentiel. Comme vous l'avez découvert, les utilisateurs peuvent souvent travailler au hasard.

Vous devez plutôt savoir quelle zone de liste déroulante a été modifiée, puis mettre à jour l'entrée appropriée dans votre groupe.

Ou une solution différente pourrait être de mettre à jour votre tableau à la fin. Alors peut-être vous avez un bouton "Process Results". Vous pouvez ensuite parcourir toutes les zones de liste déroulante pour obtenir la valeur sélectionnée.

+0

Merci pour votre aide. Je vais utiliser votre façon de penser la prochaine fois. – RandellK02

1

Voici une autre variante de la réponse de 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; 
    } 
} 
} 

Cette approche supprime la classe anonyme en ajoutant un intérieur classe. La classe interne aura toujours accès à grade. Vous ne gagnez pas grand-chose ici à moins qu'il y ait une chance que vous divisiez la classe intérieure plus tard. Bien sûr, la suggestion de camickr de traiter toutes les catégories en même temps peut également être valide, en fonction d'autres exigences (à savoir si un traitement supplémentaire est effectué après que les notes sont stockées dans la matrice, ce qui semble probable).

+0

Merci pour votre aide.C'est une bonne information parce que parfois je n'aime pas utiliser des classes anonymes si je peux avoir plus de sens avec une classe interne. – RandellK02