2012-11-21 27 views
0

我试图编写一个简单的按钮在java中点击计数器,它应该是完成的,但是当我运行它时,它出现了错误的33行JLabel更改测试,当我单击按钮应用程序崩溃。我如何解决它;我做错了什么? 下面是代码:如何更改此应用程序的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); 
     } 
    } 
} 
+1

为什么我不能编辑Q? '编辑'选项被禁用。 – Vikram

+0

@Vikram您最近的修改可能已被拒绝,其中很多。 –

+0

我不小心拒绝了某人的编辑,可能是你的@Vikram,¿我如何再次启用它? – Davynch0

回答

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

你是对的!!,有与时间变量的错误,但主要错误是第二次声明,这使得应用程序崩溃。 – Davynch0

+0

实施此更改后,请确保实施其他答案中概述的更改。 – Timr

+1

@timr更新您的答案,以包括与'时代'变量问题的问题,所以我可以对它投票;) – MadProgrammer

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;

0

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

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 ... 
    } 
+0

了解它,但仍然是,当我点击按钮,应用程序崩溃和JLabel文本更改无效 – Davynch0

+0

错误是什么 – MadProgrammer

+0

对不起,发现错误,检查更新 – MadProgrammer

相关问题