Как я могу передать не финальную переменную анонимному внутреннему классу? - PullRequest
5 голосов
/ 12 июня 2011

У меня есть эти строки кода.Я знаю, что вы не можете передать не окончательную переменную во внутренний класс, но мне нужно передать переменную i анонимному внутреннему классу, который будет использоваться в качестве идентификатора рассадки.Можете ли вы предложить способы сделать это?

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 ]

8 голосов
/ 12 июня 2011

Простой способ - создать локальную конечную переменную и инициализировать ее значением переменной цикла;например,

    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);
            }
         });
    }
2 голосов
/ 12 июня 2011

Вы не можете напрямую, но вы можете создать (статический закрытый) подкласс ActionListener, который принимает в своем конструкторе seatID.

Тогда, а не

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

у вас будет

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

[Редактировать] На самом деле, с вашим кодом так много всего плохого, что я не совсем уверен, что этот совет хорош. Как насчет представления кода, который будет компилироваться?

...