es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puede el código usar un objeto dentro de un botón?

Tengo un problema. Quiero usar mi objeto que está fuera de un botón, y obtengo un mensaje de error:

La variable local está definida en un ámbito de cierre y debe ser final o efectivamente final
File inputfile = new File("./input.txt");
testobject to = null;
try {
    Scanner inputscan = new Scanner(inputfile);
    String text1 = inputscan.nextLine();
    String text2 = inputscan.nextLine();
    to = new testobject(text1, text2);
    inputscan.close();
} catch (Exception e) {
    System.err.println(e);
}

JButton btnSave = new JButton("Guardar");
btnSave.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        to.setSomething("test");
    }
});

Obviamente, tengo una clase con un constructor, etc., pero tengo un problema para acceder a mi objeto dentro del botón.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “La variable local definida en un ámbito cerrado debe ser final o efectivamente final” se debe al hecho de que la variable “to” no está definida como final o efectivamente final. Esto significa que no se puede acceder a ella desde la clase interna anónima (el ActionListener) del botón, debido a que tiene un ámbito diferente.

    Para solucionar este problema, puede definir la variable “to” como final o efectivamente final, lo que significa que su valor no se puede cambiar después de asignado.

    Aquí hay un ejemplo de cómo hacerlo:

    final testobject to = null;
    
    // resto del código como antes
    
    JButton btnSave = new JButton("Guardar");
    btnSave.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            to.setSomething("test"); // ahora puedes usar la variable "to" dentro del botón
        }
    });
    

    Alternativamente, puede convertir “to” en una variable de instancia de su clase, de manera que se pueda acceder desde cualquier parte dentro de la clase, incluyendo el botón ActionListener.

    public class MiClase {
        private testobject to;
    
        // constructor y otros métodos aquí
    
        public void setup() {
            File archivoEntrada = new File("./input.txt");
    
            try {
                Scanner escaneoEntrada = new Scanner(archivoEntrada);
                String texto1 = escaneoEntrada.nextLine();
                String texto2 = escaneoEntrada.nextLine();
                to = new testobject(texto1,texto2);
    
                escaneoEntrada.close();
            } catch (Exception e)  {
                System.err.println(e);
            }
    
            JButton btnSave = new JButton("Guardar");
            btnSave.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    to.setSomething("test"); // ahora puedes usar la variable de instancia "to" dentro del botón
                }
            });
            // agregue el botón a su GUI
        }
    }
    

    En este caso, llamaría al método setup() para crear el botón y asignar un valor a la variable “to”.

Comments are closed.