2016-12-07 12 views
1

私のプログラムのこの段階では、キャンバスに描画されたマップがあり、ユーザーはアイテムを配置したい場所を選択するよう求められます。イベントハンドラを削除するには?

マウスクリックのx、y座標を記録するイベントハンドラを設定しましたが、これは一度だけ記録するだけです。

これは、現在、私のイベントハンドラです:

EventHandler boatHandler = new EventHandler<javafx.scene.input.MouseEvent>(){ 
     public void handle(javafx.scene.input.MouseEvent event){ 
      newX = event.getSceneX(); 
      newY = event.getSceneY(); 
      System.out.printf("setOnMouseClicked X = %f, Y = %f\n", newX, newY); 
      newX = Math.round(newX/16) *16; 
      newY = Math.round(newY/16) *16; 
      System.out.printf("Rounded to multiple of 16 X = %f, Y = %f\n", newX, newY); 
      if(newX > 0 || newY > 0){ 
       gc.drawImage(wItemset[0], newX, newY); 
      } 
     } 
    }; 

私は私は、x、yの値を取得していますが、私はどのようにのようにわからないよ一度聞いて停止するようにイベントハンドラをしたいと思います。他の質問を読んでから、私は潜在的に使用してイベントハンドラを削除することができることを発見しました:

canvas.removeEventHandler(MouseEvent.MOUSE_PRESSED, boatHandler); 

をしかし、これは if文の中に記述することはできませんので、私は私が引き金だろうかに関してはわかりませんよそれ。

X後に、yの値が記録されている、私が別のアイテムのコードの同様のブロックを有するように計画し、私はそれを確認する必要があり:

  1. 正しいアイテムが置かれ
  2. X、 yの値は、その項目ではなく、前の項目にある

編集: これは私が私のEventHandlerを追加するために使用するラインである

canvas.addEventHandler(MouseEvent.MOUSE_PRESSED, boatHandler); 

答えて

4

あなたのイベントハンドラ内で、それを引き起こす可能性が

それはそれ、これはラムダ式では動作しないことに留意すべきで

EventHandler boatHandler = new EventHandler<javafx.scene.input.MouseEvent>(){ 
     public void handle(javafx.scene.input.MouseEvent event){ 
     //code used for retrieving x,y values 
     canvas.removeEventHandler(MouseEvent.MOUSE_PRESSED, this); 

     } 
} 
+2

のようなものになります。しかし、この場合にはこのような問題はありません... – fabian

+0

パーフェクト、すぐに働きました – Dan

+0

@ fabian、私はJava 8のlambdasに関する多くの経験がないので、なぜこれがうまくいかないのか説明できますか? – user902383