Problema al acceder a una variable

Alejandro
17 de Junio del 2005
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);

}
}


rubece
17 de Junio del 2005
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.

Alejandro
17 de Junio del 2005
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.

rubece
17 de Junio del 2005
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.