在Java中将变量传递给ActionListener

我有类似下面的代码:

for(int i=0;i<10;i++){ button=new JButton(buttons[i]); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { setPage(i); } }); menu.add(button); } 

但是,变量i未在ActionListener类的范围内定义。 我怎样才能传递变量?

除了气垫船的答案之外,你应该注意到你没有被迫为你的听众使用匿名课程。 Hovercraft的答案代码类似于以下代码:

 private class PageActionListener implements ActionListener { private int page; public PageActionListener(int page) { this.page = page; } public void actionPerformed(ActionEvent e) { setPage(page); } } ... for(int i = 0; i < 10; i++){ button = new JButton(buttons[i]); button.addActionListener(new PageActionListener(i)); menu.add(button); } 

一种完全不同的方法是向按钮添加属性,并在动作侦听器中检索该属性。 例如

 button=new JButton(buttons[i]); button.putClientProperty( "page", i ); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { setPage((Integer)((JButton)e.getSource()).getClientProperty( "page" )); } }); 

变量i实际上在ActionListener的范围内,但由于您尝试在内部类中使用局部变量,因此该变量必须是final。 所以,你可以使用一个最终变量:

 for(int i=0;i<10;i++){ final int index = i; button=new JButton(buttons[i]); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { setPage(index); } }); menu.add(button); }