如何更改此应用程序的JLabel中的文本?

时间:2012-11-21 03:47:06

标签: java swing jlabel

我正在尝试在java中编写一个简单的按钮点击计数器,它应该已经完成​​,但是当我运行它时,第33行的JLabel测试更改似乎有问题,当我点击按钮应用程序崩溃。我如何解决它;我做错了什么? 这是代码:

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);
        }
    }
}

4 个答案:

答案 0 :(得分:3)

虽然所有其他答案部分正确,但您还有另一个大错误。您定义clicksCounter两次。进入全局变量后,再次进入构造函数。

请参阅:

JTextField clicksCounter;

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

将第二行(位于构造函数中)更改为:clicksCounter = new JTextField("Número de Clicks");//Muestra el número de clicks a l boton.

如果你不这样做,你会得到一个NullPointerException。

您遇到的另一个问题是ActionListener中times的本地定义。通过在监听器本身中定义times,您可以在每次单击按钮时重置它,从而破坏计数器的用途。

移动times,使其超出动作侦听器的范围,最好是所有其他全局定义。您的动作监听器应如下所示:

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

答案 1 :(得分:2)

每次单击按钮时都会创建times变量并将其增加...

int times=0;
times ++; // This will never be anything other then 1

更改动作侦听器类,以便将times变量作为类实例的一部分进行维护

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

您将clicksCounter定义为实例变量,但在构造函数中,您将创建一个名为相同的本地实例(AKA名称冲突)。这意味着当您运行progam时,实例变量clicksCounter为空。

更改构造函数以删除对局部变量的引用...

public class Eventos extends JFrame{

    JTextField clicksCounter;
    Eventos (){
        // ... Your previous code ...
        JTextField clicksCounter = new JTextField("Número de Clicks");//Muestra el número de clicks al boton.
        // ... Your previous code ...
    }

答案 2 :(得分:0)

public void actionPerformed(ActionEvent handler){
        int times=0;
        times ++;
        clicksCounter.setText("Clicks:"+times);
}

在此方法中,times是一个局部变量。无论何时调用此方法,其值都将初始化为0。相反,你必须使用:

private static int times=0;
public void actionPerformed(ActionEvent handler) {
    times ++;
    clicksCounter.setText("Clicks:"+times);
}

更好的解决方案是使用

public class Eventos extends JFrame implements ActionListener

并使用times作为非静态变量private int times=0;

答案 3 :(得分:0)

times需要是您的Eventos班级或ButtonHandler的成员变量。实际上,每次点击按钮时它都会被0实例化,因为它是一个局部变量。