我有一个简单的问题,下面的代码如何知道按下了什么索引,让我感到困惑的是它通过for循环为每个按钮添加了一个actionlistener,但是当我按下一个按钮时,程序怎么知道索引是否是1或5,因为索引只等于for循环当前索引(如果这没有意义让我知道,idk如何使这个问题正常工作)
private void buttonEvtListeners(){
for(int i=0;i<6;i++){
final int index = i;
comp.buttons1[i].addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
if(index < 3){
System.out.println("Save button index: " + index);
}else{
System.out.println("Panel Save button index: " + index);
}
}
});
comp.buttons2[i].addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
if(index < 3){
System.out.println("Default button index: " + index);
}else{
System.out.println("Panel Default button index: " + index);
}
}
});
comp.buttons3[i].addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
if(index < 3){
System.out.println("Undo button index: " + index);
}else{
System.out.println("Panel Undo button index: " + index);
}
}
});
}
}
答案 0 :(得分:4)
匿名类会获取他们使用的字段的副本。如果有this
,他们甚至会复制this$0
。 (默认情况下调用final
)如果使用调试器或反射,则可以看到这些值。它们隐式传递给类的构造函数并进入最终字段。它可以访问的字段必须是{{1}}才能简化使用。在Java 8中,闭包可以访问实际上是最终的字段,即它们可以是最终的。