2016-03-10 24 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();