在Java中将变量传递给ActionListener

Leo*_*ang 5 java swing jbutton 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 19

除了气垫船的答案,你应该注意到你没有被迫为你的听众使用匿名课程.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);
}
Run Code Online (Sandbox Code Playgroud)

  • downvoter:小心解释你的downvote? (3认同)

Rob*_*bin 19

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

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" ));
   }
});
Run Code Online (Sandbox Code Playgroud)


Hov*_*els 13

变量i 实际上在ActionListener的范围,但因为你是试图一个内部类使用一个局部变量,该变量必须是最终决定.所以,您可以使用最终变量:

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);
}
Run Code Online (Sandbox Code Playgroud)