2015-06-03 4 views
0

Я пытаюсь применить метод к массиву массивов через цикл for.Применить метод для массива для цикла

К сожалению, когда я вставил свой массив массивов внутри метода checkGuess, я получаю сообщение об ошибке «Локальная переменная x, определенная в охватывающей области, должна быть окончательной или эффективной окончательной». Я немного новичок в Java, поэтому я не уверен, что я делаю неправильно ... любая помощь будет очень признательна.

for(int x = 0; x < columns.length; x++){ 
columns[x][y].addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent event) { 
     checkGuess(columns[x][y]); 
    } 
}); 

    if(x>4 && y<5){ 
     y++; 
     x=-1;  
    } 
} 

Дополнительная информация:

Массив массивов содержит JButtons. Метод checkGuess() принимает JButton в качестве аргумента, как так:

checkGuess(JButton guess){ 
} 
+0

возможного дубликат. проверьте это [ответ] (http://stackoverflow.com/questions/4732544/why-are-only-final-variables-accessible-in-anonymous-class) –

ответ

0

В Java переменные, которые используются в анонимном классе, должны быть окончательными (или в Java 8, фактически окончательными - по существу, то же самое, только без явного модификатора final). Что касается этого, у Jon Skeet есть очень хороший ответ на этот вопрос here.

Один из способов коррекции коды просто назначить x до конечной ссылки, как показано ниже:

for (int x = 0; x < columns.length; x++) { 
    final int copy = x; 

    columns[x][y].addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      checkGuess(columns[copy][y]); 
     } 
    }); 
} 
+0

Спасибо, сработало !! – user3124181

0

ActionListener является внутренним анонимным классом, и он не знает, что «х», когда он пытается прочитать его при прохождении массива массивов функции checkGuess().

непроверенный, но это может работать:

for(int x = 0; x < columns.length; x++){ 
columns[x][y].addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent event) { 
     checkGuess(this); 
    } 
}); 

    if(x>4 && y<5){ 
     y++; 
     x=-1;  
    } 
} 

Если нет, то вам нужно будет узнать, как передать й в класс.

Я считаю, что «это» будет ссылаться на родительский элемент класса, который должен быть «столбцами [x] [y]. Я мог ошибаться.