Javafx 范围内无法访问AnimationTimer类型的封闭实例

Javafx 范围内无法访问AnimationTimer类型的封闭实例,javafx,Javafx,我正在使用JavaFX创建我自己的乒乓球游戏版本。在显示最终分数后,单击给定的按钮返回主菜单,我尝试启动我的AnimationTimer或循环。然而,我得到了这个错误,“在范围内不能访问AnimationTimer类型的封闭实例”。如何在按钮的.setOnAction内重新启动AnimationTimer 这是我的AnimationTimer的代码 new AnimationTimer() { public void handle(long now) {

我正在使用JavaFX创建我自己的乒乓球游戏版本。在显示最终分数后,单击给定的按钮返回主菜单,我尝试启动我的AnimationTimer或循环。然而,我得到了这个错误,“在范围内不能访问AnimationTimer类型的封闭实例”。如何在按钮的.setOnAction内重新启动AnimationTimer

这是我的AnimationTimer的代码

new AnimationTimer() {
        public void handle(long now) {
            if(playing) {
                x += dx;
                y += dy;

                if ( x < 0 || x+ball.getWidth() > scene.getWidth() )
                    dx = -dx;
                if (y < 0 )
                    dy = -dy;

                if(y > scene.getHeight() && lives > 0) {
                    x = 400;
                    y = 400;
                    dx = 5;
                    dy = -5;
                    lives-=5;
                    life.setText("Lives: " + lives);
                }

                if(left && pX > 5) {
                    pX -= speed;
                } else if(right && pX+paddle.getWidth() < scene.getWidth() - 5) {
                    pX += speed;
                }


                if (x > pX-40 && x < pX + paddle.getWidth() && y == pY-paddle.getHeight()-15) {
                    dy = -dy;
                    score+=1;
                    scores.setText("Score: " + score);
                }



                life.relocate(10, 10);
                ball.relocate(x, y);
                paddle.relocate(pX, pY);
            }

            if(lives == 0) {
                playing = false;
                gameover = true;
                this.stop();
                root.getChildren().removeAll(paddle, ball, scores, life);
                finalScore.setText("" + score);
                root.getChildren().add(finalScore);
                root.getChildren().add(returnToMain);
                returnToMain.setOnAction(new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent e) {
                        playing = false;
                        gameover = false;
                        root.getChildren().addAll(start, pong);
                        root.getChildren().removeAll(finalScore, returnToMain);

                        AnimationTimer.this.start();
                    }
                });
            }       
        }
    }.start();
newanimationtimer(){
公共无效句柄(长){
如果(玩){
x+=dx;
y+=dy;
如果(x<0 | | x+ball.getWidth()>scene.getWidth())
dx=-dx;
if(y<0)
dy=-dy;
如果(y>scene.getHeight()&&lives>0){
x=400;
y=400;
dx=5;
dy=-5;
寿命-=5;
life.setText(“lifes:+lifes”);
}
如果(左&pX>5){
pX-=速度;
}else if(right&&pX+pable.getWidth()pX-40&&x
这似乎是为
returnToMain
定义事件处理程序的错误位置,但您不能将
AnimationTimer.this.start()
替换为
start()
?是的,这很有效,但是当我这样做时,我似乎再也不能删除finalScore,returnToMainI不知道您的意思“return to main”实际上,我想我真的不知道你所说的“不再”是什么意思。以前的版本实际上没有编译,所以你甚至无法运行它。所以它以前肯定没有做任何其他事情。我想这听起来好像你有一个完全不同的问题,只有在你修复第一个问题时才变得明显。