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

时间:2011-06-12 02:53:04

标签: java inner-classes anonymous-inner-class

我有这些代码行。我知道你不能将非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);
        }
    });
}

2 个答案:

答案 0 :(得分: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);
            }
         });
    }

答案 1 :(得分:2)

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

然后而不是

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

你有

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

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

相关问题