0

さて、他の場所で必要なものを正確に見つけることができなかったので、ここに行きます。

ActionListener()内の関数に変数を渡すにはどうすればよいですか?これは私のコードです。

for(int y = 0; y < 5; y ++) {
        for(int x = 0; x < 5; x ++) {
            currentRect = (y * 5) + x;
            mainButtons.get(currentRect).addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    answerField.setText(questions.get(currentRect).getAnswer());
                }
            });
        }
    }

エラーは6行目にあり、「currentRect」に下線が引かれ、これについて不平を言っています。

別のメソッドで定義された内部クラス内の非最終変数currentRectを参照できません

JButtonのグループ(javax.swing)を反復処理し、ArrayList内の位置に基づいて適切なアクションリスナーを割り当てますが、位置を格納している変数をactionlistener自体に渡すことができないようです。だから私は立ち往生しています。これを書いているときに、実際にforeachを使用する必要があることに気付いたので、後で変更します。(誰がそれを指摘するのかについてのちょっとしたメモ)forループ中に変更されるため、その変数をfinalにすることもできないことに気付きました。また、currentRectの値((y * 5)+ x)を関数に渡そうとしましたが、役に立ちませんでした。

ありがとう、

andrewgies17

4

1 に答える 1

2

解決策は簡単です。ブロック内で新しいfinal変数を宣言するだけです。

for(int y = 0; y < 5; y ++) {
        for(int x = 0; x < 5; x ++) {
            final int currentRect = (y * 5) + x;

または、ブロック外でcurrentRectの値が必要な場合:

for(int y = 0; y < 5; y ++) {
        for(int x = 0; x < 5; x ++) {
            currentRect = (y * 5) + x;
            final int currentRect2 = currentRect;

匿名クラスでcurrentRectの代わりにcurrentRect2を使用します。これは、最終変数が毎回再初期化されているように見えるため、直感に反しますが、実際には、これをブロックのループごとに1回だけ初期化される新しい変数と見なす必要があります。

ただし、これはこの問題を解決するための最もインテリジェントな方法ではありません。ボタンごとに異なる小さな値を格納するためだけに、ボタンごとに新しい匿名クラスを作成しているためです。これらは、限られたデバイスですぐに合計される可能性があります。currentRectの値を各ボタンのタグとして保存することをお勧めします。このようにして、外部クラスで匿名クラスの単一のインスタンスを宣言し、それをすべてのボタンに再利用できます。

于 2012-12-18T00:34:09.000 に答える