2016-06-14 43 views
0

卡片是JButtons,我試圖向每個人添加一個actionListener,因爲我將它們添加到了世界中。這些卡片是在二維數組中,我用for循環添加它們。然而,我無法獲得某張牌,因爲當我在actionListener類中使用table [r] [c]時,出現一個錯誤,提示「從內部類引用的局部變量必須是最終的或有效的最終結果」。但是這是一個循環,所以我不能做出最後的決定。任何幫助,將不勝感激在內部類中引用「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循環中創建一個新的final變量。 – 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

快速解決方法是將您的循環變量分配到您的內部類可以訪問的最終變量中。

for(int loopR = 0;r<2;r++){ 
     for(int loopC=0;c<5;c++){ 
      final int r = loopR; 
      final int c = loopC; 
      // the rest of your code, using r and c 
      // rather than loopR and loopC 
     } 
} 

但提取與R和C參數的新類是可能更容易閱讀和理解不是引入新的變量。

+0

我喜歡這個答案。 – RobotKarel314