2016-09-26 4 views
0

Чтобы сократить код, я начал создавать списки с компонентами, необходимыми в моем проекте java, чтобы получить к ним доступ с помощью простого for-loop.addItemListener with for-loop невозможно

Как все работает, я хотел бы добавить ItemListeners к компонентам в списке:
checkBoxes.get(0).addItemListener(){/*including code here*/}
работает совершенно нормально, однако я хотел бы установить их с петлей, а также. Поэтому я пробовал это:

for (int i=0; i<=10; i++){ 
    checkBoxes.get(i).addItemListener(new ItemListener){ 
     public void itemStateChanged(ItemEvent arg0){ 
      someMethod(i); 
     } 
    }); 
} 

как checkBoxes должен запускать другой метод на основе их индекса. Я получаю сообщение об ошибке компилятора:

Local variable i defined in an enclosing scope must be final or effectively final

Так я предполагаю, что я не могу добавить ItemListeners в этой динамично? Есть ли способ обойти это?

После второй проверки кажется, что я не могу использовать i?

+0

Будет ли 'someMethod (i)' обрабатывать каждый флажок точно так же?. Если это так, вам может не понадобиться передавать индекс. Если метод должен знать, с какой кнопкой он имеет дело, тогда лучше всего проверить источник действия, найти кнопку в списке и передать это во время выполнения. Надеюсь, это поможет – jr593

+0

Предполагается, что он отключит счетчик с тем же индексом в другом списке. Спасибо за предложение, однако; Я запомню это! – geisterfurz007

ответ

1

Как компилятор говорит, i должен быть окончательным.

Для этого вы можете использовать промежуточную конечную переменную в цикле.

for(int i=0; i<checkBoxes.size(); i++) { 
    final int finalI = i; 

    checkBoxes.get(i).addItemListener(new ItemListener(){ 
     public void itemStateChanged(ItemEvent arg0){ 
      someMethod(finalI); 
     } 
    }); 
} 
+0

Ну, спасибо большое! Однако вы должны были быстро ответить ... Приняли уже; отмечен как за 7 минут :) – geisterfurz007

+0

@ geisterfurz007 Добро пожаловать :) – BackSlash