¿Podemos cambiar un JLabel de otra clase en Java?

Soy nuevo en Java y estoy tratando de usar a JLabely a JButton. Mi problema es que no puedo cambiar JLabelel actionPerformed()método. No puede encontrar la variable nbr. Por favor ayuda :(

package com.test;

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main extends JFrame implements ActionListener{

    int x = 0;

    public static void main(String[] args) {
        new Main().setVisible(true);
    }

    public Main(){
        super("Test");
        setSize(640, 480);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setLayout(new FlowLayout());
        JButton button1 = new JButton("Button1");
        button1.addActionListener(this);
        add(button1);
        JLabel nbr = new JLabel(x);
        add(nbr);
    }

    public void actionPerformed(ActionEvent e){
        x++;
        nbr.setText(x);
    }
}
Respuesta 1

Esto se debe a que está accediendo a una variable que está en un alcance diferente y limitado. En su caso, su nbrse define en su Main()función y se limita solo a ese alcance. Si desea acceder a él, debe hacerlo global, significa que debe declararlo en su clase.

Ejemplo:

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main extends JFrame implements ActionListener{

    int x = 0;
    private JLabel nbr; // declare a global variable

    public static void main(String[] args) {
        new Main().setVisible(true);
    }

    public Main(){
        super("Test");
        nbr = new JLabel(); // initialize here...

        setSize(640, 480);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setLayout(new FlowLayout());
        JButton button1 = new JButton("Button1");
        button1.addActionListener(this);
        add(button1);
        nbr.setText(x); // set text to that variable here...
        add(nbr);
    }

    public void actionPerformed(ActionEvent e){
        x++;
        nbr.setText(x);
    }
}

Ps: compruebe si hay errores de sintaxis, escribí esto sin probar. :)

Respuesta: 2

No estoy recibiendo clases internas. ¿Cuál es la razón para usar clases internas en Java? ¿Me puede dar un buen ejemplo de clases anidadas estáticas y no estáticas? ¿Cuáles son las ventajas / desventajas de esto? ...

Tengo un proyecto que consta de dos módulos. Uno de ellos considerado principal. Entonces el segundo depende del primero. También debería generar archivos jar javadoc para módulos. La salida debe ser cuatro .jar ...

Estoy tratando de integrar Apple Map Web Snapshot que necesita un parámetro de consulta de firma en la URL. Pude generar y validar con éxito la firma ES256 en el paquete JWA de NPM pero no en Java. ...

Estoy haciendo un juego en 2D, nada lujoso, con objetos (llamados entidades de ahora en adelante) que deberían chocar entre sí y con el terreno. Ahora, detectar colisión no es el problema, el problema es cuando el ...