我正在使用循环向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
时的字体。
答案 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
关键字)。在匿名类的对象中,它将始终具有在对象创建期间的相同值。