2016-06-14 4 views
0

Карты JButtons, и я пытаюсь добавить к ним ActionListener, когда я добавляю их в мир. Карты находятся в 2D-массиве, и я добавляю их для циклов. Однако я не могу получить определенную карту, потому что, когда я использую таблицу [r] [c] в классе actionListener, я получаю сообщение об ошибке: «Локальные переменные, на которые ссылается внутренний класс, должны быть окончательными или фактически окончательными». Но это цикл 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-loop. – 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

Смежные вопросы