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

他のすべての答えは部分的に正しいですが、もう1つの大きなエラーもあります。clicksCounter2回定義します。一度グローバル変数に入れ、もう一度コンストラクターに入れます。

見る:

JTextField clicksCounter;

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

2行目(コンストラクター内にあります)を次のように変更します。clicksCounter = new JTextField("Número de Clicks");//Muestra el número de clicks a l boton.

これを行わないと、NullPointerExceptionが発生します。

timesあなたが持っている他の問題はあなたのActionListener内のロー​​カル定義です。リスナー自体で定義することにより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しますが、コンストラクターで、同じ名前のローカルインスタンスを作成します(別名名前の競合)。これは、プログラムを実行すると、インスタンス変数clicksCounterがnullになることを意味します。

コンストラクターを変更して、ローカル変数への参照を削除します。

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

timesEventosクラスまたはのいずれかのメンバー変数である必要がありますButtonHandler。これは0ローカル変数であるため、ボタンがクリックされるたびにインスタンス化されます。

于 2012-11-21T03:52:46.523 に答える