如何删除事件处理程序?

时间:2016-12-07 19:31:13

标签: java javafx

我的程序的这个阶段有一个绘制到画布的地图,并提示用户选择他们想要放置项目的位置。

我设置了一个事件处理程序来记录鼠标点击的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值适用于该项目而非前一项目
  3. 修改 这是我用来添加EventHandler

    的行
    canvas.addEventHandler(MouseEvent.MOUSE_PRESSED, boatHandler);
    

1 个答案:

答案 0 :(得分:5)

您可以在事件处理程序中触发它

它会是那样的

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

        }
}