Problema al acceder a una variable
Saludos compañeros, al acceder a una variable de una clase me da el siguiente error (al acceder a la variable dt_modelo, en la clase Datos_automata_aleatorio): "local variable dt_modelo is accessed from within inner class; needs to be declared final" y no se por que me sale este error, si lo hago igual que en otra clase, y no me da erro, y es practicamente el mismo codigo.
Por favor, ayudarme que estoy muy atascao con esto ultimo. Gracias.
public class Menu extends JPanel
{
DefaultTableModel dtm;
...
// defino los actionListener de un menu
actionListener al_generar=new ActionListener()
{
public void actionPerformed (actionEvent e)
{
new Datos_automata_aleatorio(dtm);
}
}
}
y el codigo de la clase Datos_automata_aleatorio es:
class Datos_automata_aleatorio extends JPanel
{
// creación de distintos paneles
public void
escribir_en_fichero_y_generar_aleatorio
(DefaultTableModel dtm_aleat)
{
new Generar_aleatorio(dimension, long_max, car_alfabeto, num_cad_pos, num_cad_neg, dtm_aleat);
}
}
Datos_automata_aleatorio(DefaultTableModel dt_modelo)
{
crear.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
escribir_en_fichero_y_generar_aleatorio(dt_modelo);
// en la linea anterior es donde me da el error
}
} ); // fin del action listener
p.add (...); // añadir en el panel principal todos los demas
JFrame m=new JFrame();
m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
m.getContentPane().add(p);
m.setSize(300,450);
m.setTitle("Automata aleatorio");
m.setVisible(true);
}
}
Por favor, ayudarme que estoy muy atascao con esto ultimo. Gracias.
public class Menu extends JPanel
{
DefaultTableModel dtm;
...
// defino los actionListener de un menu
actionListener al_generar=new ActionListener()
{
public void actionPerformed (actionEvent e)
{
new Datos_automata_aleatorio(dtm);
}
}
}
y el codigo de la clase Datos_automata_aleatorio es:
class Datos_automata_aleatorio extends JPanel
{
// creación de distintos paneles
public void
escribir_en_fichero_y_generar_aleatorio
(DefaultTableModel dtm_aleat)
{
new Generar_aleatorio(dimension, long_max, car_alfabeto, num_cad_pos, num_cad_neg, dtm_aleat);
}
}
Datos_automata_aleatorio(DefaultTableModel dt_modelo)
{
crear.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
escribir_en_fichero_y_generar_aleatorio(dt_modelo);
// en la linea anterior es donde me da el error
}
} ); // fin del action listener
p.add (...); // añadir en el panel principal todos los demas
JFrame m=new JFrame();
m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
m.getContentPane().add(p);
m.setSize(300,450);
m.setTitle("Automata aleatorio");
m.setVisible(true);
}
}
Estás accediendo a una variable local o parámetro de un método desde una clase interna que está en ese método. Desde una clase interna solo puedes acceder a variables locales o parámetros que sean constantes, o sea, que hayan sido declarados con el modificador final. Le tendrás que poner el modificador final a la variable local dt_modelo para que te funcione, aunque si la modificas en el método vas a seguir teniendo problemas y posiblemente tendrás que copiarla a una variable local final. Bueno eso es todo. Que te vaya bien. Hasta luego.
No te entendi del todo bien, lo siento. No es una variable local, es un parametro, y no encuentro ningun constructor de copia de DefaultTableModel. Me lo podrias indicar, porfavor ??? Gracias.
El problema que tú tienes es que en el primer listener accedes a un atributo, que puedes ser accedido sin problemas desde el método actionPerformed de la clase interna anónima con la que creas el listener. Despues en el segundo listener accedes a un parámetro (en este caso, da igual que sea parámetro o una variable local) del método que contiene la clase interna con la que creas el listener. Desde los métodos de una clase interna, solo se pueden acceder a variables locales (o parámetros) que hayan sido declarados con el modificador final. Es decir, que si sigues queriendo usar dt_modelo como parámetro tendrás que declararlo como final, es decir, hacer esto:
Datos_automata_aleatorio(final DefaultTableModel dt_modelo)
en vez de:
Datos_automata_aleatorio(DefaultTableModel dt_modelo)
Así te debería funcionar. Bueno eso es todo. Que te vaya bien. Hasta luego.
Datos_automata_aleatorio(final DefaultTableModel dt_modelo)
en vez de:
Datos_automata_aleatorio(DefaultTableModel dt_modelo)
Así te debería funcionar. Bueno eso es todo. Que te vaya bien. Hasta luego.
