0

我正在尝试在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

4 回答 4

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。

您遇到的另一个问题是timesActionListener 中的本地定义。通过times在您的侦听器本身中定义,您每次单击按钮都会重置它,从而破坏了计数器的目的。

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

private class ButtonHandler implements ActionListener{
    public void actionPerformed(ActionEvent handler){
        times++;
        clicksCounter.setText("Clicks:"+times);
    }
}
于 2012-11-21T03:55:47.850 回答
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 名称冲突)。这意味着当您运行程序时,实例变量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 ...
    }
于 2012-11-21T03:53:46.960 回答
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;

于 2012-11-21T03:52:32.313 回答
0

times需要是一个成员变量,要么是你的Eventos类,要么是ButtonHandler. 0实际上,每次单击按钮时都会实例化它,因为它是一个局部变量。

于 2012-11-21T03:52:46.523 回答