2011-06-12 4 views
5

나는이 코드 라인을 가지고있다. 최종 변수를 내부 클래스에 전달할 수는 없지만 변수 i을 익명 내부 클래스에 전달하여 seatingID로 사용해야합니다. 그렇게하는 방법을 제안 할 수 있습니까?최종 변수가 아닌 변수를 익명의 내부 클래스에 전달하려면 어떻게해야합니까?

JButton [] seats = new JButton [40]; //creating a pointer to the buttonsArray 
for (int i = 0; i < 40; i++) 
{ 
    seats[i] = new JButton();//creating the buttons 
    seats[i].setPreferredSize(new Dimension(50,25));//button width 
    panel4seating.add(seats[i]);//adding the buttons to the panels 

    seats[i].addActionListener(new ActionListener() 
    { //anonymous inner class 
     public void actionPerformed(ActionEvent evt) 
     { 
      String firstName = (String)JOptionPane.showInputDialog("Enter First Name"); 
      String lastName = (String)JOptionPane.showInputDialog("Enter Last Name"); 

      sw101.AddPassenger(firstName, lastName, seatingID); 
     } 
    }); 
} 
+0

버그를 나타내는 최소한의 컴파일 가능한 코드를 제시하면 더 나은 답변을 얻을 수 있습니다. 위 코드에서 'seatingID'가있는 'i'를 의미합니까? –

+0

사실 실제로 버그가 없습니다. 그래서 for 루프에서 내부 클래스로 변수 i를 전달하는 방법을 알아 내려고 노력 중이므로 그 코드를 seatingID로 할당 할 수 있습니까 – dave

답변

8

간단한 방법은 로컬 최종 변수를 만들고 루프 변수의 값으로 초기화하는 것입니다. 예 :

JButton [] seats = new JButton [40]; //creating a pointer to the buttonsArray 
    for (int i = 0; i < 40; i++) 
    { 
     seats[i] = new JButton();//creating the buttons 
     seats[i].setPreferredSize(new Dimension(50,25));//button width 
     panel4seating.add(seats[i]);//adding the buttons to the panels 
     final int ii = i; // Create a local final variable ... 
     seats[i].addActionListener(new ActionListener() 
     { //anonymous inner class 
      public void actionPerformed(ActionEvent evt) 
      { 
       String firstName = (String)JOptionPane.showInputDialog("Enter First Name"); 
       String lastName = (String)JOptionPane.showInputDialog("Enter Last Name"); 

       sw101.AddPassenger(firstName, lastName, ii); 
      } 
     }); 
    } 
+0

+1 예, 이것이 제가 제안한 것입니다. (단지'ii '대신에'seatingID'라고 명명했을 것입니다.) –

+0

덕분에 도움이되었습니다. – cljk

2

직접 할 수 없습니다,하지만 당신은 생성자에 seatingID 소요 된 ActionListener의 (정적 개인) 서브 클래스를 만들 수 있습니다.

그런 것이 아니라

seats[i].addActionListener(new ActionListener() { ... }); 

당신은 할 것

seats[i].addActionListener(new MySpecialActionListener(i)); 

[편집] 사실,이 조언이 좋은 정말 모르겠어요 코드를 잘못 다른 너무 많은있다 . 컴파일하는 코드를 표현하는 것은 어떨까요?

+0

어느 부분입니까? 나는 새로운 스윙입니다. 이것은 프로그램의 일부일뿐입니다. – dave

+0

sw101은 어디에도 선언되어 있지 않으며 seatingID는 아무 곳에서나 선언되지 않고 사용자가 두 번 이상 버튼을 친다면 어떻게됩니까? 주요 질문에 대한 내 의견을 참조하십시오. –

+0

sw101은 비행 객체이며 어딘가에 선언되었습니다. 제 문제는 변수 i를 전달하는 방법을 찾는 것입니다. – dave

관련 문제