Search code examples
javaswingjlabel

How do I change the text in a JLabel for this app?


I'm trying to program a simple button clicks counter in java, and it's supposed to be finished, but when I run it, it appear to be something wrong with the JLabel change of test in line 33, when i click the button the application crashes. How do I fix it; what I am doing wrong? Here is the code:

package Main;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Eventos extends JFrame{

    JTextField clicksCounter;
    Eventos (){
        //Parámetros generales de la ventana.
        super("Eventos en Java");//Titulo de la ventana.
        setSize(320,200);//Tamaño de la ventana.
        setVisible(true);//Configurar como visible.
        setLocation(520,220);//Posicion inicial de la ventana en el medio y un poco arriba.
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//Salir al cerrrar la venta.
        this.setLayout(new GridLayout(2,1));
        //Componentes dentro de la ventana.
        JButton ClickMe = new JButton("Haz Click aqui!");//Boton que cuenta clicks.
        add(ClickMe);//Agrega el Boton a la venatana.
        ClickMe.setSize(140, 20);
        ClickMe.setLocation(90,40);
        JTextField clicksCounter = new JTextField("Número de Clicks");//Muestra el número de clicks al boton.
        add(clicksCounter);
        ButtonHandler handler = new ButtonHandler();
        ClickMe.addActionListener(handler);
    }
    private class ButtonHandler implements ActionListener{
        public void actionPerformed(ActionEvent handler){
            int times=0;
            times ++;
            clicksCounter.setText("Clicks:"+times);
        }
    }
}

Solution

  • While all the other answers are partially correct, you also have one other large error. You define clicksCounter twice. Once in your global variables, and again within your Constructor.

    See:

    JTextField clicksCounter;

    JTextField clicksCounter = new JTextField("Número de Clicks");//Muestra el número de clicks a l boton.

    Change the second line (located within your constructor) to simply: clicksCounter = new JTextField("Número de Clicks");//Muestra el número de clicks a l boton.

    If you don't do this, you'll get a NullPointerException.

    The other problem you have is the local definition of times within your ActionListener. By defining times in your listener itself, you reset it with every click of the button, thus defeating the purpose of the counter.

    Move times so it's outside the scope of the action listener, preferably with all other global definitions. Your action listener should then look like this:

    private class ButtonHandler implements ActionListener{
        public void actionPerformed(ActionEvent handler){
            times++;
            clicksCounter.setText("Clicks:"+times);
        }
    }