2011-11-17 4 views
1

하나의 EventListener는 내가 모든 초기화 물건을, JButton의 여러 JButton의 자바

JButton[][] ledBtns = new JButton[8][8]; 

그리고 루프에서

의 2 차원 배열을 가지고있다. 이제 Button을 클릭 할 때 발생하는 각 JButton에 EventListener를 추가하려고합니다. 그런 다음 버튼의 이미지를 변경하고 싶습니다.

for(int i = 0; i < ledBtns.length; i++){ 
    for(int j = 0; j < ledBtns[i].length; j++){ 
    //init stuff 
    ledBtns[i][j].addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
     changeImage(); 
    } 
}); 
    } 
} 

이제 'changeImage()'가 호출되지만 어떤 버튼이 있는지 알아야합니다. 매개 변수를 사용할 수 없습니다. 매개 변수를 '최종'으로 선언하는 경우 매개 변수를 사용할 수 없습니다. 정확하게 똑같은 64 가지 메소드를 작성하고 각 JButton에 수동으로 추가하는 것보다 다른 방법이 있습니까?

답변

2

가장 쉬운 방법은 두 개의 임시 최종 int를 선언하고이를 참조하는 것입니다.

for(int i = 0; i < ledBtns.length; i++){ 
    for(int j = 0; j < ledBtns[i].length; j++){ 
    //init stuff 
    final int finalI = i; 
    final int finalJ = j; 
    ledBtns[i][j].addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
     changeImage(finalI,finalJ); 
    } 
    }); 
} 
3

ActionEvent 클래스 이벤트를 발생하는 성분을 얻기 위해 사용되는 방법 getSource()있다.

+1

+1 플러스 JButton을 ButtonModel, HashMap, Action, setName 또는 putClientProperty()에 넣습니다. – mKorbel

2

JButton 객체의 "name"속성을 설정할 수 있으며, mre의 대답에 따라 getSource() 메서드를 호출 할 수 있습니다. 그래서 신원 확인 단추를 클릭 할 수 있습니다.

0

또 다른 옵션은 클래스가 ActionListner (즉, implements ActionListner)를 구현하도록하는 것입니다.

루프에서 버튼을 순환하면 ledBtns[i][j].addActionListener(this)이라고 할 수 있습니다.

물론, 어떤 객체가 이벤트 소스인지 파악해야합니다 (보통 if...else 블록 사용). 이제는 64 개의 객체에 대해 다루기 힘들 수 있지만 작은 항목의 경우 일반적으로 문제가되지 않습니다.

또는 actionPerformed 메서드 변경 이미지를 호출하고 단추 개체 등을 전달하여 작업을 수행 할 수 있습니다.

내가 제안한 것은 또 다른 옵션입니다. 나는 당신의 코드에 가장 잘 맞는 것을 만들고, 가장 깨끗하고 읽기 쉬운 것을 할 것입니다.

관련 문제