0

J'essaie d'ajouter un actionListener anonyme à un JCheckBox mais j'ai du mal à accéder à l'objet avec lequel je veux mettre à jour la valeur. Je continue à recevoir des erreurs sur non final, et quand je les change pour être définitif, il se plaint d'autres choses.
ce que im essayant de faire est ci-dessous (je l'ai retiré une partie du code graphique pour le rendre plus facile à lire):actionListener sur jcheckbox

for (FunctionDataObject fdo : wdo.getFunctionDataList()) 
{ 
    JLabel inputTypesLabel = new JLabel("Input Types: "); 
    inputsBox.add(inputTypesLabel); 
    for (int i = 0; i < fdo.getNumberOfInputs(); i++) 
    { 
     JLabel inputLabel = new JLabel(fdo.getInputNames().get(i)); 
     JComboBox inputTypeComboBox = new JComboBox(getTypes()); 
     inputTypeComboBox.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) 
      { 
       fdo.getInputTypes().set(i, (String) inputTypeComboBox.getSelectedItem()); 
      } 
     }); 
    } 
}  
+0

I pense que ce problème est caché dans le code qui n'est pas présenté, pour une meilleure aide plus tôt après un [SSCCE] (http://sscce.org/), il pourrait y avoir des erreurs dans le concept de code, pas comment définir l'indicateur final pour anonyme écouteur – mKorbel

Répondre

1

Vous ne pouvez pas accéder à une variable non finale dans une classe anonyme. Vous pouvez modifier légèrement votre code pour contourner cette restriction (j'ai fait fdo et inputTypeComboBox finale et je l'ai également fait une copie finale de i):

for (final FunctionDataObject fdo : wdo.getFunctionDataList()) { 
     JLabel inputTypesLabel = new JLabel("Input Types: "); 
     inputsBox.add(inputTypesLabel); 
     for (int i = 0; i < fdo.getNumberOfInputs(); i++) { 
      final int final_i = i; 
      JLabel inputLabel = new JLabel(fdo.getInputNames().get(i)); 
      final JComboBox inputTypeComboBox = new JComboBox(getTypes()); 
      inputTypeComboBox.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        fdo.getInputTypes().set(final_i, (String) inputTypeComboBox.getSelectedItem()); 
       } 
      }); 
     } 
    } 
+0

a bien fonctionné, merci beaucoup! – user1584120

1

Mise à jour du code de

inputTypeComboBox.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) 
     { 
      fdo.getInputTypes().set(i, (String) inputTypeComboBox.getSelectedItem()); 
     } 
    }); 

à

final counter = i; 
final JComboBox inputTypeComboBox = new JComboBox(getTypes()); 
final FunctionDataObject finalFDO = fdo; 
inputTypeComboBox.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) 
     { 
      finalFDO.getInputTypes().set(counter, (String) inputTypeComboBox.getSelectedItem()); 
     } 
    }); 

lien This explique pourquoi vous ne pouvez accéder à des variables finales en classe interne

+0

'i' doit également être final. – assylias

+0

merci @assylias Je l'ai mis à jour maintenant – RNJ

1

Cela fonctionne:

for (final FunctionDataObject fdo : wdo.getFunctionDataList()) { 
     JLabel inputTypesLabel = new JLabel("Input Types: "); 
     inputsBox.add(inputTypesLabel); 
     for (int i = 0; i < fdo.getNumberOfInputs(); i++) { 
      JLabel inputLabel = new JLabel(fdo.getInputNames().get(i)); 
      final JComboBox inputTypeComboBox = new JComboBox(getTypes()); 
      final int index = i; 
      inputTypeComboBox.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        fdo.getInputTypes().set(index, (String) inputTypeComboBox.getSelectedItem()); 
       } 
      }); 
     } 
    }