For loop javafx鼠标单击for循环中的事件

For loop javafx鼠标单击for循环中的事件,for-loop,mouseevent,javafx-8,mouseclick-event,For Loop,Mouseevent,Javafx 8,Mouseclick Event,我正在用javafx构建一个国际象棋游戏应用程序,遇到了一个我不太理解的问题。我试图为我的棋子实现鼠标点击事件,但当我尝试使用for循环为每个棋子实现鼠标点击事件时,我得到了错误“从lambda表达式引用的局部变量必须是final或有效final”。但是,当我独立创建每个鼠标事件时,没有问题 public static ChessPiece[] BlackPieces = { new ChessPieceRook("BLACK"), new ChessPieceKnight("B

我正在用javafx构建一个国际象棋游戏应用程序,遇到了一个我不太理解的问题。我试图为我的棋子实现鼠标点击事件,但当我尝试使用for循环为每个棋子实现鼠标点击事件时,我得到了错误“从lambda表达式引用的局部变量必须是final或有效final”。但是,当我独立创建每个鼠标事件时,没有问题

public static ChessPiece[] BlackPieces = {
    new ChessPieceRook("BLACK"),
    new ChessPieceKnight("BLACK"),
    new ChessPieceBishop("BLACK"),
    new ChessPieceQueen("BLACK"),
    new ChessPieceKing("BLACK"),
    new ChessPieceBishop("BLACK"),
    new ChessPieceKnight("BLACK"),
    new ChessPieceRook("BLACK")};
这项工作:

BlackPieces[0].setOnMouseClicked((MouseEvent event) -> {
    if (turn % 2 == 0) {
        setSelection(BlackPieces[0]);
        setSelectionClip(PieceClips[0]);
    }
});
但这并不是:

for (int i = 0; i < 8; i++) {
    BlackPieces[i].setOnMouseClicked((MouseEvent event) -> {
        if (turn % 2 == 0) {
            setSelection(BlackPieces[i]);
            setSelectionClip(PieceClips[i]);
        }
    });
}
for(int i=0;i<8;i++){
BlackPieces[i].setOnMouseClicked((MouseeEvent事件)->{
如果(回合%2==0){
选举(黑片[i]);
设置选择剪辑(片段剪辑[i]);
}
});
}

有人能给我解释一下吗?

什么叫“它不工作”?定义函数后,
i
的值在变化。哦,我明白你的意思了。我很难习惯这些lambda表达式,谢谢你的洞察力!“它不工作”意味着什么?定义函数后,
i
的值正在改变。哦,我明白你的意思了。我很难习惯这些lambda表达式,谢谢你的洞察力!可能重复的