使用循环添加动作侦听器,索引越界错误

时间:2015-11-28 01:56:46

标签: java actionlistener indexoutofboundsexception

我正在使用循环向5个项目添加一些监听器。我收到了一个OOB错误,我知道原因,但我不知道如何修复它。

以下是代码:

int i;//class variable

...

for(i = 0; i < fonts.length; i++){//both fonts and fontItemList are the same size: 5

            fontItemList[i] = new JMenuItem(fonts[i]);  
            fontItemList[i].addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){
                    editor.setFont(new Font(fonts[i], 0, 12));//error occurs here 
                }

            });
        }

我收到错误的原因是因为只有当用户点击该项时才执行侦听器,但是,到那时,i = 5,这是我的列表的大小,导致OOB错误。

此代码应该做的是创建5个JMenuItem个对象,这些对象将更改按下相应JMenuItem时的字体。

1 个答案:

答案 0 :(得分:2)

您不应在此处使用类变量(字段)i,因为它对于每个侦听器都是相同的。您实际需要的是捕获font

for(int i=0 ; i<fonts.length; i++) {
    final String font = fonts[i];
    fontItemList[i] = new JMenuItem(font);  
    fontItemList[i].addActionListener(new ActionListener(){

        public void actionPerformed(ActionEvent e){
            editor.setFont(new Font(font, 0, 12));
        }

    });
}

这样每个听众都会得到自己的font。在匿名类中,您可以捕获final局部变量(因为Java-8,如果您实际上没有更改变量,则可以省略final关键字)。在匿名类的对象中,它将始终具有在对象创建期间的相同值。