比如我在一个panel上放置10个按钮,然后我有一个int数组num[10],我希望第i个按钮按下时,触发num[i]+1
我用for循环生成按钮,但是碰到个问题就是ActionListener类里面不能调用外面的i,求教怎么写可以实现我要的功能?
for(int i=0;i<10;i++){
JButton btn=new JButton();
btn.addActionListener(new ActionListener()
{
      public void actionPerformed(ActionEvent event)
      {
                    num[i]++;//这里不能引用i,如何修改可以解决?
      }
});
btnpanel.add(btn);
}
Java

解决方案 »

  1.   

    貌似不行,匿名内部类访问外部的变量必须是final修饰的
    final修饰就意味着不变,就无法通过final i进行循环
    编译肯定是通不过的.
      

  2.   

    就是想问换什么方法可以实现我要的效果?
    可以看看import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;public class Test extends JFrame implements ActionListener { JButton btn1;
    /**10个按钮*/
    //数组
    int[] num = new int[10]; public Test() {
    this.setSize(200, 200);
    this.setVisible(true);
    this.setLayout(new FlowLayout());
    btn1 = new JButton("BUTTON1");
    this.add(btn1);
    btn1.addActionListener(this);//注册监听 } public static void main(String args[]) { new Test(); } @Override
    public void actionPerformed(ActionEvent e) {
    //根据得到的btn对象确定数组的那个元素自增
    if (e.getSource() == btn1) {
    num[1]++;
    System.out.println("RESULT:" + num[1]);
    }
    }
    }
      

  3.   

    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
    public class Main extends JFrame implements ActionListener {
     
        JButton []btn = new JButton[10];
        /**10个按钮*/
        //数组
        int[] num = new int[10];
     
        public Main() {
            this.setSize(200, 200);
            this.setVisible(true);
            this.setLayout(new FlowLayout());
            for(int i=0; i<10; i++){
             btn[i] = new JButton("BUTTON" + i);
             this.add(btn[i]);
             btn[i].addActionListener(this);//注册监听
            }
         }
     
        public static void main(String args[]) { 
            new Main(); 
        }
     
        public void actionPerformed(ActionEvent e) {
            //根据得到的btn对象确定数组的那个元素自增
         for(int i=0; i<10; i++){
         if (e.getSource() == btn[i]) {
         num[i]++;
         }
                System.out.println("RESULT: " + num[i]);
            }
        }
    }
      

  4.   


    for(int i=0;i<10;i++){
    JButton btn=new JButton();
            final int t = i;
    btn.addActionListener(new ActionListener()
    {
          public void actionPerformed(ActionEvent event)
          {
                        num[t]++;// 加一个final再拿来引用即可。。
          }
    });
    btnpanel.add(btn);
    }