2013-08-15 4 views
3

아래 샘플을 작성하여 여러 JCheckBox 만들기와 Action Listener를 시뮬레이트했습니다.여러 ActionListener를 사용하여 여러 JCheckBox 만들기

int global=0; 

//some code 

JCheckBox[] checkBox = new JCheckBox[2]; 

     for(int i = 0; i <=1; i++){ 

     checkBox[i] = new JCheckBox(strings[i]); 
     panel.add(checkBox[i]); 

      checkBox[i].addItemListener(new ItemListener() { 

       @Override 
       public void itemStateChanged(ItemEvent evt) { 
        if (evt.getStateChange() == ItemEvent.SELECTED){ 
         JOptionPane.showConfirmDialog(null, "Message"+global); 
        } 
       } 
      });                
      global++; 
     } 

내가 얻지 못하는 것은 대화 상자의 출력물이 항상 "메시지 2"라는 것입니다. 내 로직에서 각 체크 박스에 대해 하나의 AddItemListener를 선언 할 경우 "Message 1"및 "Message 2"와 같은 각 확인란의 두 가지 대화 상자를 받아야합니다. 여기서 내가 뭘 잘못하고 있니? 어떻게 처리할까요? showConfirmDialog() 먼저 당신이 바로 JOptionPane.showConfirmDialog(null, "Message"+global); 전에 (각 통화에서 증가합니다) global++를 넣어 시도 각각의 체크 박스에 대한 다른 메시지를 원하는 경우에 global 이미 2. 가치있다라고하며이 그것을 만들 것입니다

+0

가'지역 변수 또는 인스턴스 변수를 global' :

@Override public void itemStateChanged(ItemEvent evt) { int loc = indexInArray(evt.getItem(),checkBox); if (evt.getStateChange() == ItemEvent.SELECTED){ JOptionPane.showConfirmDialog(null, "Message"+global); } } }); 

당신은 방법 indexInArray에서 간단한 검색을 구현할 수 있습니다 클래스? 그리고 어떤 컴파일러를 사용하고 있습니까? –

+0

@SayemAhmed :'global'이 지역 변수 인 경우, OP는'global'이 final로 선언되지 않았기 때문에 ItemListener의 익명 클래스 내에서'global' 변수에 접근 할 수 없었습니다. – Mac

+0

@Mac : 그래, 그거야. 생각. 코드 샘플이 혼란스러워 보였습니다. –

답변

2

사전에

감사합니다 당신에게 더 분명합니다. 나는 각각의 체크 박스 하나 addItemListener를 선언하고있어 경우

, 나는 왜 당신을 각는 "메시지 1"과 "메시지 2"

로, 상자를 확인하기위한 두 개의 서로 다른 대화 상자를받을한다 체크 박스 당 리스너가 하나 뿐인 경우 체크 상자 당 두 가지 (다른) 리스너 메서드를 호출해야한다고 생각하십니까?

가능한 해결책 중 하나는 해당 인스턴스 변수에 표시 할 메시지 (또는 번호 만 포함)를 자신의 ItemListener에 구현하는 것입니다.

2

global는 코드에서 작성중인 JChekcbox 객체에 아무 관련이있다. 따라서 응용 프로그램에서 itemStateChanged을 호출 할 때마다 global의 최신 값인 2을 읽습니다. 달성하고자하는 것을 얻으려면 다음과 같이 코드를 변경해야합니다.

for(int i = 0; i <=1; i++){ 

     checkBox[i] = new JCheckBox(strings[i]); 
     panel.add(checkBox[i]); 
      checkBox[i].addActionCommand(String.valueOf(i+1)); 
      checkBox[i].addItemListener(new ItemListener() { 

       @Override 
       public void itemStateChanged(ItemEvent evt) { 
        if (evt.getStateChange() == ItemEvent.SELECTED){ 
         JOptionPane.showConfirmDialog(null, "Message"+((JCheckBox)evt.getSource()).getActionCommand()); 
        } 
       } 
      }); 
     global++; 
    } 
1

코드에서 전역은 루프 반복마다 1 씩 증가합니다. 루프 종료 후 global 값이 2이므로 "Message 2"가 표시됩니다. 이 숫자는 배열의 위치를 ​​나타낼 경우, 나는 시도 것 :

public int indexInArray(Object []objects, Object obj){ 
    for(int i = 0 ; i < objects.length; i++){ 
     if(objects[i] == obj){ 
      return i; 
     } 
    } 
    return -1; 
}    
관련 문제