2012-12-17 3 views
0

좋아, 다른 곳에서는 필요했던 것을 정확히 찾을 수 없으므로 여기로갑니다.ActionListener에 변수 전달하기

변수를 ActionListener() 내부의 함수로 전달하는 방법은 무엇입니까? 이것은 내 코드입니다.

for(int y = 0; y < 5; y ++) { 
     for(int x = 0; x < 5; x ++) { 
      currentRect = (y * 5) + x; 
      mainButtons.get(currentRect).addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent event) { 
        answerField.setText(questions.get(currentRect).getAnswer()); 
       } 
      }); 
     } 
    } 

오류, 그것은 "currentRect"을 강조하고 이것에 대해 불평 라인 여섯에

가에 정의 된 내부 클래스 내부가 아닌 최종 변수 currentRect을 참조 할 수 없습니다 다른 방법 JButton의 (javax.swing의)의 그룹을 반복 한 다음, 그러나, ArrayList를에서의 위치에 따라 적절한 액션 청취자를 할당한다 않습니다 무엇

I 자신의 위치를 ​​actionListener 자체에 저장하는 변수를 전달할 수 없어 보일 수 있습니다. 나는이 글을 쓰는 동안 실제로 foreach를 사용해야한다는 것을 깨달았습니다. (누가 그 점을 지적했는지에 대한 약간의 노트) for 루프 중에 변경되기 때문에 최종 변수를 final로 만들 수 없다는 것을 알고 있습니다. 나는 또한 currentRect (y * 5) + x)의 값을 함수에 전달하려고 시도했지만 아무 소용이 없었다.

감사합니다,

andrewgies17

+0

'event' 객체에서 필요한 것을 얻을 수 있습니까? – gMale

+0

오류 메시지 힌트로 컴파일러를 만족시키기 위해'currentRect'를'final'로 선언 할 수 있습니다. 이것이 좋은 디자인인지 여부는 완전히 다른 문제입니다. –

답변

2

해결책은 간단하다, 단순히 블록의 내부에 새로운 최종 변수를 선언 :

for(int y = 0; y < 5; y ++) { 
     for(int x = 0; x < 5; x ++) { 
      final int currentRect = (y * 5) + x; 

을하거나 블록의 외부 currentRect의 값을 필요로하는 경우 :

for(int y = 0; y < 5; y ++) { 
     for(int x = 0; x < 5; x ++) { 
      currentRect = (y * 5) + x; 
      final int currentRect2 = currentRect; 

및 currentRect2 대신 currentRect를 사용합니다. 익명의 수업. 반 직관적입니다. 왜냐하면 최종 변수가 매번 다시 초기화되는 것처럼 보이기 때문입니다. 실제로는 블록의 각 루프마다 한 번만 초기화되는 새 변수로 간주해야합니다.

그러나이 방법은이 문제를 해결하는 가장 지적인 방법은 아닙니다. 서로 다른 작은 값을 저장하기 위해 각 버튼에 새로운 브랜드의 익명 클래스를 작성하기 때문입니다. 이들은 제한된 장치에 빠르게 추가 될 수 있습니다. currentRect의 값을 각 버튼의 태그로 저장하는 것이 더 좋습니다. 이렇게하면 외부 클래스에서 익명 클래스의 단일 인스턴스를 선언하고 모든 버튼에 다시 사용할 수 있습니다.