2016-03-10 25 views
0

我一直在玩JavaFX最近,我只是想出如何使用MouseEvent s,我想做一个程序,当你点击,它抓住你的XY并创建一个圈在那个地方。从内部类引用的局部变量

我试试这个时出现错误local variables referenced from an inner class。我打算使用拉姆达,但我无法弄清楚。

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 
import javafx.scene.control.Label; 
import javafx.scene.layout.VBox; 
import javafx.event.EventHandler; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.shape.Circle; 
public class circle extends Application{ 
    Scene scene; 
    VBox v; 
    public void start(Stage stage){ 
     double x = 0; 
     double y = 0; 
     v = new VBox(10); 
     scene = new Scene(v, 300, 300); 
     scene.setOnMousePressed(new EventHandler<MouseEvent>(){ 
      public void handle(MouseEvent e) 
      { 
       x = e.getX(); 
       y = e.getY(); 
      } 
     }); 
     Circle circle = new Circle(); 
     circle.setCenterX(x); 
     circle.setCenterY(y); 
     v.getChildren().add(circle); 
     stage.setScene(scene); 
     stage.show(); 
    } 
} 

回答

0

错误消息告诉你的问题是什么:你的局部变量,xy,在一个内部类中引用 - 你EventHandler。您需要声明xy作为您的Circle类(应按照惯例大写,btw)的成员,而不是start函数中的局部变量。然后你就可以在你的EventHandler中设置它们。

1

即使您编译了代码,它也不会更新该圆的位置。您只需设置一次该圈的centerXcenterY,此时x=0y=0即可。如果您被允许访问内部类中的(非最终的,非实际最终的)局部变量,则您所做的只是更新xy,而不是该圆的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 Circle circle = new Circle();