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

5

我有以下代码。我知道你不能将非 final 变量传递给内部类,但是我需要将变量 i 传递给匿名内部类,以便用作座位 ID。你能提供一些解决方案吗?

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

如果您提供最小的可编译代码来演示错误,您将获得更好的答案。在上面的代码中,您是否指的是“i”,而不是“seatingID”? - Burleigh Bear
实际上没有错误,我正在尝试找到一种方法将for循环中的变量i传递给内部类,以便我可以将其分配为seatingID。 - dave
2个回答

8

一个简单的方法是创建一个本地的final变量,并用循环变量的值进行初始化;例如:

    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 是的,这也是我提出的建议。(只是我会将其命名为 seatingID 而不是 ii。) - Paŭlo Ebermann

2
您不能直接这样做,但是您可以创建一个(ActionListener的静态私有)子类,在其构造函数中传入一个seatingID参数。

然后不再使用

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

你需要

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

[编辑] 实际上,你的代码还有很多其他问题,我不确定这个建议是否好。不如展示一下可以编译的代码。


哪一部分?我对Swing不熟悉。这只是程序的一部分。 - dave
sw101 没有在任何地方声明,seatingID 也没有在任何地方声明,当用户多次点击按钮时会发生什么?请参见我对主要问题的评论。 - Burleigh Bear
sw101是一个航班对象,并且在某个地方已经被声明。我的问题是找出一种传递变量i的方法。 - dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接