引用来自" for循环的整数"在一个内在的阶级

时间:2016-06-14 23:22:23

标签: java

卡是JButton,当我将它们添加到世界时,我试图为每个添加一个actionListener。这些卡是2D阵列,我将它们与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--;
                        }           
                    }
                }
            );

2 个答案:

答案 0 :(得分: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();
   }
}

答案 1 :(得分: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参数提取新类可能比引入新变量更容易阅读和理解。