Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将非final变量传递给匿名内部类?_Java_Inner Classes_Anonymous Inner Class - Fatal编程技术网

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

Java 如何将非final变量传递给匿名内部类?,java,inner-classes,anonymous-inner-class,Java,Inner Classes,Anonymous Inner Class,我有这些代码行。我知道您不能将非final变量传递给内部类,但我需要将变量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].se

我有这些代码行。我知道您不能将非final变量传递给内部类,但我需要将变量
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);
        }
    });
}
JButton[]座位=新JButton[40]//创建指向按钮阵列的指针
对于(int i=0;i<40;i++)
{
seats[i]=newjbutton();//创建按钮
座椅[i].setPreferredSize(新尺寸(50,25));//按钮宽度
panel4seating.add(seats[i]);//将按钮添加到面板
seats[i].addActionListener(新ActionListener()
{//匿名内部类
已执行的公共无效操作(操作事件evt)
{  
String firstName=(String)JOptionPane.showInputDialog(“输入名字”);
String lastName=(String)JOptionPane.showInputDialog(“输入姓氏”);
sw101.添加乘客(名、姓、座位号);
}
});
}

您不能直接创建ActionListener,但可以创建ActionListener的(静态私有)子类,该子类在其构造函数中使用seatingID

然后而不是

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

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

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

简单的方法是创建一个局部final变量,并用循环变量的值初始化它;e、 g

    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);
            }
         });
    }
JButton[]座位=新JButton[40]//创建指向按钮阵列的指针
对于(int i=0;i<40;i++)
{
seats[i]=newjbutton();//创建按钮
座椅[i].setPreferredSize(新尺寸(50,25));//按钮宽度
panel4seating.add(seats[i]);//将按钮添加到面板
final int ii=i;//创建一个局部final变量。。。
seats[i].addActionListener(新ActionListener()
{//匿名内部类
已执行的公共无效操作(操作事件evt)
{  
String firstName=(String)JOptionPane.showInputDialog(“输入名字”);
String lastName=(String)JOptionPane.showInputDialog(“输入姓氏”);
sw101.AddPassenger(名字、姓氏、ii);
}
});
}

哪个部分?我不太会荡秋千。这只是程序的一部分。sw101不在任何地方声明,seatingID不在任何地方声明,当用户多次点击按钮时会发生什么?请参阅我对主要问题的评论。sw101是一个飞行对象,它被声明在某个地方,我的问题是找到一种传递变量i的方法。如果您提供演示错误的最少可编译代码,您将得到更好的答案。你是说在上面的代码中有seatingID的“i”吗?实际上没有bug,我试图找到一种方法将变量i从for循环传递到内部类,这样我就可以将它指定为seatingID+1是的,这也是我提出的。(只是我会把它命名为
seatingID
,而不是
ii