我试图创建一个方法将SetOnMousePressed函数添加到多个节点,并且我尝试过使用几个不同的循环等,但我总是最终得到错误"局部变量在封闭范围内定义的x必须是最终的或有效的最终版本。"这就是我所得到的:
public static int playerSelectingCategory(int intScorecard[][], Rectangle[][] scoreboardBackground, int categoryCounter, int nrOfPlayers, boolean limitCheck)
{
int counter = 0;
int y = 0;
for(int x = 0; x<YatzyConstants.getNrCategories(); x++)
{
if(counter < nrOfPlayers)
{
if(y < YatzyConstants.getNrCategories())
{
scoreboardBackground[counter][y].setOnMousePressed(e ->
{
scoreboardBackground[counter][y].setFill(javafx.scene.paint.Color.ALICEBLUE);
});
y++;
}
counter++;
}}
return intScorecard[counter][y];
}
我最初一个接一个地宣布一切,但我必须认为应该有一个更有效的方法。任何帮助表示赞赏,真的在这里打了一堵砖墙。
答案 0 :(得分:0)
由于您的代码修改了y
,因此它不是最终的,因此无法从匿名类或lambda表达式访问。 counter
也是如此。
我建议将scoreboardBackground[counter][y]
存储在(有效)final
的变量中(除非修改了数组,并且您希望在该位置为Rectangle
着色存储原始rect的地方......):
final Rectangle rect = scoreboardBackground[counter][y];
rect.setOnMousePressed(e -> {
rect.setFill(javafx.scene.paint.Color.ALICEBLUE);
});
或者只是使用作为事件来源的Node
:
final EventHandler<MouseEvent> handler = event -> {
((Shape) event.getSource()).setFill(javafx.scene.paint.Color.ALICEBLUE);
};
for(int x = 0; x<YatzyConstants.getNrCategories(); x++)
{
if(counter < nrOfPlayers)
{
if(y < YatzyConstants.getNrCategories())
{
scoreboardBackground[counter][y].setOnMousePressed(handler);
y++;
}
....