1

我有一个快速的问题,以下代码如何知道按下了哪个索引,令我困惑的是它通过 for 循环为每个按钮添加了一个动作侦听器,但是当我按下一个按钮时,程序如何知道索引是否为 1或 5,因为 index 仅等于 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);
                }
            }
        });
    }
}
4

1 回答 1

4

匿名类获取他们使用的字段的副本。this如果有的话,他们甚至会复制一份。(默认调用this$0)如果您使用调试器或反射,您可以看到这些值。它们被隐式传递给类的构造函数并成为最终字段。它可以访问的字段必须是final为了简化使用。在 Java 8 中,闭包可以访问实际上是 final 的字段,即它们本来可以是 final 的。

于 2013-07-14T22:18:25.287 回答