2016-03-10 4 views
0

В последнее время я играю с JavaFX, и я просто понял, как использовать MouseEvent s, я хотел создать программу, где, когда вы нажимаете, она захватывает ваши X и Y и создает круг в этом месте.Локальные переменные, на которые ссылается внутренний класс

Я получаю сообщение об ошибке 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

Сообщение об ошибке говорит вам, что проблема: ваши локальные переменные, x и y, в настоящее время ссылаются на внутренний класс - ваш EventHandler. Вам необходимо объявить x и y как члены вашего класса Circle (который должен быть капитализирован по соглашению, кстати), а не как локальные переменные в функции start. Затем вы сможете установить их в своем EventHandler.

1

Даже если ваш код скомпилирован, он не обновит положение круга. Вы устанавливаете centerX и centerY круга только один раз, в то время, когда x=0 и y=0. Если вам было разрешено иметь доступ к локальным переменным (не конечным, неэффективным) локальным переменным во внутреннем классе, все, что вы делаете, - это обновить x и y, а не centerX и centerY.

Вам просто нужно

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(); 
} 

версия лямбда-выражение выглядит

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(); 
} 

В версиях Java До Java8, вам нужно будет объявить circle как окончательный, который вы можете легко сделать:

final Circle circle = new Circle(); 
Смежные вопросы