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

时间:2016-05-08 16:34:23

标签: java user-interface javafx event-handling

我试图创建一个方法将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];
}

我最初一个接一个地宣布一切,但我必须认为应该有一个更有效的方法。任何帮助表示赞赏,真的在这里打了一堵砖墙。

1 个答案:

答案 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++; 
        }
....