2016-06-14 17 views
0

カードはJButtonです。私はそれらをワールドに追加するときに、それぞれにactionListenerを追加しようとしています。カードは2次元配列であり、forループでそれらを追加しています。しかし、私はactionListenerクラス内でtable [r] [c]を使用すると、 "内部クラスから参照されるローカル変数は最終的にまたは効果的にfinalでなければならない"というエラーが発生するため、特定のカードを取得できません。しかし、それはforループなので、私はそれを最終的にすることはできません。どんな助けもありがたいです内部クラス内の "forループ"から整数を参照する

for(int r = 0;r<2;r++){ 
     for(int c=0;c<5;c++){ 
      int rNum = gen.nextInt(cards.size()); 

      table[r][c]= new Card("deck",cards.get(rNum), 2); 
      cards.remove(rNum); 
      add(table[r][c]); 
      table[r][c].addActionListener(
       new ActionListener() 
       { 
        public void actionPerformed(ActionEvent event){ 
         BufferedImage img2 = null; 
         BufferedImage img = null; 
         int pos = table[r][c].getName().indexOf("."); 
         String s = table[r][c].getName().substring(0,pos) + "S" + table[r][c].getName().substring(pos, table[r][c].getName().length()); 
         try{ 
          img = ImageIO.read(new File(table[r][c].getPat()+"/"+table[r][c].getName())); 
         }catch(IOException e){ 
          e.printStackTrace(); 
         } 
         try{ 
          img2 = ImageIO.read(new File(table[r][c].getPat()+"/"+s)); 
         }catch (IOException e){ 
          e.printStackTrace(); 
         }     
         if(!table[r][c].isAlive()){ 
          ImageIcon imgFace2 = new ImageIcon(img2); 
          table[r][c].setIcon(imgFace2); 
          table[r][c].changeState(); 
          number++; 
         }else{ 
          ImageIcon imgFace = new ImageIcon(img); 
          table[r][c].setIcon(imgFace); 
          table[r][c].changeState(); 
          number--; 
         }   
        } 
       } 
      ); 
+0

インラインで実装するのではなく、ActionListenerのトップレベルクラスを作成することをお勧めします。次に、必要なものをそのクラスのコンストラクタに渡すことができます。 –

+0

しかしforループで新しい最終変数を作成することができます。 – tkausl

+0

そして、私はJava 8でインラインクラスに非最終変数を渡すことができると信じています – RobotKarel314

答えて

0

数字はActionListenerに引数として渡すことができます。例:

table[r][c].addActionListener(new Listener(r, c)); 
... 

private class Listener implements ActionListener 
{ 
    private int myR, myC; 
    public Listener(int r, int c) 
    { 
     myR = r; 
     myC = c; 
    } 
    public void actionPerformed(ActionEvent event) 
    { 
     //referece myR and myC here 
     //e.g. table[myR][myC].changeState(); 
    } 
} 
0

簡単な修正は、内部変数がアクセスできる最終変数にループ変数を割り当てることです。

しかし、rとcパラメータで新しいクラスを抽出することは、新しい変数を導入するよりも読みやすく分かりやすいでしょう。

+0

私はこの答えが好きです。 – RobotKarel314

関連する問題