我正在尝试在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);
}
}
}
答案 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
实例化,因为它是一个局部变量。