2011-08-01 7 views
6

Me aparece el error: "NO SE PUEDE REFERIR A UN PAPEL VARIABLE NO FINAL DENTRO DE UNA CLASE INTERNA DEFINIDA EN UN MÉTODO DIFERENTE". Quiero ser capaz de establecer el tipo de rol de cadena a lo que sea get seleccionado en ese menú desplegable. ¿Cómo puedo hacer esto si no en la forma en que estoy tratando a continuación, o simplemente estoy cometiendo un error estúpido en el código que estoy tratando?No se puede referir/modificar la variable no final en una clase interna

Gracias, Ravin

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class Funclass extends JFrame { 

    FlowLayout layout = new FlowLayout(); 
    String[] skillz = {"Analytical", "Numerical", "Leadership", 
     "Communication", "Organisation", "Interpersonal"}; 
    String[] rolez = {"Developer", "Sales", "Marketing"}; 
    String[] Industries = {"Consulting", "Tech"}; 
    String R1, R2, R3, R4, roletype; 

    public Funclass() { 
     super("Input Interface"); 
     setLayout(layout); 
     JTextField Company = new JTextField("Company Name"); 
     JComboBox TYPE = new JComboBox(Industries); 
     JList skills = new JList(skillz); 
     JComboBox role = new JComboBox(rolez); 
     skills.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
     add(TYPE); 
     add(skills); 
     add(role); 
     add(Company); 

     ROLE.addItemListener(new ItemListener() { 

      public void itemStateChanged(ItemEvent event) { 
       if (event.getStateChange() == ItemEvent.SELECTED) { 
        roletype = rolez[role.getSelectedIndex()]; 
       } 
      } 
     }); 
    } 
} 
+4

¿Realmente el compilador/IDE le gritó tan grosero? – BalusC

+0

Sé que es tan malo. He estado coqueteando con otros como castigo. – Ravin

Respuesta

2

tiene que declarar la variable role como final de manera que la clase interna (ItemListener) puede tener acceso a ella, así:

final JComboBox role = new JComboBox(rolez); 
+1

Esto no funcionará porque 'roletype' también se debe declarar como' final'. – tskuzzy

+0

Eso no funcionará porque está modificando 'roletype' en la clase interna;) – tskuzzy

+2

tskuzzy: la restricción final solo se aplica al acceder a las variables delimitadas dentro del método que define la clase local. La clase interna todavía tiene acceso a las variables de clase adjuntas – Kal

0

Para acceder variables en la clase externa de una clase interna, deben declararse final. Entonces, en este caso, role debe ser final.

EDIT: roletype no necesita ser declarado final aunque se acceda a él en la clase interna porque es una variable de clase, no una variable de método.

+0

Disculpa, leí mal el código y pensé que '' tipo de rol 'también se declaró en el constructor. Desde entonces he editado mi respuesta y lo he dejado en claro. – tskuzzy

1
import java.awt.event.*; 
import javax.swing.*; 

public class Funclass extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private String[] rolez = {"Developer", "Sales", "Marketing"}; 
    private String roletype; 
    private JComboBox role; 

    public Funclass() { 
     role = new JComboBox(rolez); 
     role.addItemListener(new ItemListener() { 

      public void itemStateChanged(ItemEvent event) { 
       if (event.getStateChange() == ItemEvent.SELECTED) { 
        roletype = role.getSelectedItem().toString(); 
       } 
      } 
     }); 
    } 
} 
Cuestiones relacionadas