从内部类引用的局部变量

时间:2016-03-10 18:56:59

标签: java javafx

我最近一直在玩JavaFX并且我只想出了如何使用MouseEvent,我想创建一个程序,当你点击它时,它会抓住你的X和{ {1}}并在该地方创建一个圆圈。

我在尝试此操作时收到错误Y。我打算使用lambda,但我无法弄明白。

local variables referenced from an inner class

2 个答案:

答案 0 :(得分:1)

即使您的代码已编译,也无法更新圆圈的位置。您只需在centerXcenterY时设置圈子的x=0y=0一次。如果您被允许访问内部类中的(非最终的,非有效最终的)局部变量,那么您要做的就是更新xy,而不是圆圈&#39 ; s centerXcenterY属性。

你只需要

public void start(Stage stage){
    v = new VBox(10);
    scene = new Scene(v, 300, 300);
    Circle circle = new Circle();
    v.getChildren().add(circle);
    scene.setOnMousePressed(new EventHandler<MouseEvent>(){
        public void handle(MouseEvent e)
        {
            circle.setCenterX(e.getX());
            circle.setCenterY(e.getY());
        }
    });
    stage.setScene(scene);
    stage.show();
}

lambda表达式版本看起来像

public void start(Stage stage){
    v = new VBox(10);
    scene = new Scene(v, 300, 300);
    Circle circle = new Circle();
    v.getChildren().add(circle);
    scene.setOnMousePressed(e -> {
        circle.setCenterX(e.getX());
        circle.setCenterY(e.getY());
    });
    stage.setScene(scene);
    stage.show();
}

在Java8之前的Java版本中,您需要将circle声明为final,您可以随时执行:

final Circle circle = new Circle();

答案 1 :(得分:0)

错误消息告诉您问题所在:您的本地变量xy正在内部类中引用 - 您的EventHandler。您需要将xy声明为Circle类的成员(应按约定大写,btw),而不是start函数中的局部变量。然后,您就可以在EventHandler

中设置它们