2012-11-21 26 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

相關問題