Javafx在循环中添加事件处理程序



我正在尝试制作一个方法,将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++; 
        }
....

相关内容

  • 没有找到相关文章

最新更新