2016-06-17 13 views
0

この動作の仕組みを理解する上で問題があります。私はSceneBuilder 2.0で円を作成し、この方法を使用する場合:MouseEventがJavaFXのgetX()およびgetSceneX()の同じ座標を返す理由

circleLayer.setOnMousePressed(me -> { 
    System.out.println("***" + me.getX() + " " + me.getY()); 
}); 

をI円(中央が0,0である)に値xとyの親族を得ます。それが私の必要なものです。しかし、コード内でまったく同じことをすると、私はシーン座標を取得します。

コード:

public class Main2 extends Application { 
    private Scene scene; 
    private Circle circleLayer; 

    private void init(Stage primaryStage) { 
     Group root = new Group(); 
     primaryStage.setResizable(false); 
     scene = new Scene(root, 600, 460); 
     primaryStage.setScene(scene); 
     // 
     circleLayer = new Circle(300, 300, 100); 
     circleLayer.setFill(Color.PURPLE); 
     root.getChildren().add(circleLayer); 
     // 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     init(primaryStage); 
     primaryStage.show(); 
     circleLayer.setOnMousePressed(me -> { 
      System.out.println("***"+me.getX() +" "+me.getY()); 
     }); 
     // 
     scene.addEventFilter(MouseEvent.MOUSE_PRESSED, mouseEvent ->{ 
      System.out.println(mouseEvent.getX()+" "+mouseEvent.getY()); 
     }); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

これはなぜ起こるのでしょうか?なぜ私はgetX()getSceneY()と同じ値を得ているのですか?

Circleに関連する座標を取得する必要があります。

答えて

0

図形の座標系は、変換が適用されていない場合は、その親の座標系と同じになります。この場合、親はシーンのルートであるため、親の座標系(したがって円の座標系)はシーンの座標系と同じです。したがって、シーン上とサークル上のマウスイベントの場合はgetX()getY()が同じ結果を生成します。

あなたは(私の知る限りそれを理解)を達成しようとしているものを手に入れるために、あなたが円の中央(0,0)を持つようにしたい:

circleLayer = new Circle(0, 0, 100); 

、あなたはその後、親に場所に移動することができます翻訳を使用して、そのローカル座標系を維持しながら、あなたが、欲しい:

circleLayer.setTranslateX(300); 
circleLayer.setTranslateY(300); 

あなたはコードを投稿していなかったように私は、あなたがSceneBuilderと見ている効果にコメントすることはできません。

関連する問題