我正在尝试制作一个方法,将SetOnMousePressed函数添加到多个节点,我也尝试过使用几个不同的循环等,但我总是以错误"封闭范围中定义的局部变量x必须是final或实际上是final。"
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];
}
我本来把所有的东西都一一申报了,但我不得不认为应该有一种更有效的方法来做。任何帮助都是值得感激的,真的是碰壁了。
由于y
是由代码修改的,因此它不是有效的最终值,因此无法从匿名类或lambda表达式访问。counter
也是如此。
我建议将scoreboardBackground[counter][y]
存储在(有效地)final
的变量中(也就是说,除非修改了数组,并且您希望在存储原始rect的位置为Rectangle
着色…):
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++;
}
....