如何将非final变量传递给匿名内部类?

我有这些代码行。 我知道你不能将非final变量传递给内部类但我需要将变量i传递给匿名内部类以用作seatID。 你能建议这样做的方法吗?

 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); } }); } 

简单的方法是创建一个局部最终变量并使用循环变量的值初始化它; 例如

  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); } }); } 

你不能直接,但你可以创建一个ActionListener的(静态私有)子类,在其构造函数中使用seatID。

然后而不是

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

你有

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

[编辑]实际上,你的代码还有很多其他错误,我不确定这个建议是好的。 如何呈现将编译的代码。