如何删除事件处理程序?

Dan*_*Dan 1 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);
            }
        }
    };
Run Code Online (Sandbox Code Playgroud)

我希望事件处理程序在检索到x,y值后停止侦听,但我不确定如何.从阅读其他问题我发现我可以使用以下方法删除事件处理程序:

canvas.removeEventHandler(MouseEvent.MOUSE_PRESSED, boatHandler);
Run Code Online (Sandbox Code Playgroud)

但这不能写在if语句中,所以我不确定如何触发它.

在记录了x,y值之后,我计划为另一个项目设置一个类似的代码块,我需要确保:

  1. 放置正确的项目
  2. x,y值适用于该项目,而不是前一项目

编辑: 这是我用来添加EventHandler的行

canvas.addEventHandler(MouseEvent.MOUSE_PRESSED, boatHandler);
Run Code Online (Sandbox Code Playgroud)

use*_*383 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);

        }
}
Run Code Online (Sandbox Code Playgroud)

  • 应该注意,这不适用于lambda表达式.但是在这种情况下没有这样的问题...... (4认同)
  • @user902383:在 lambda 中,“this”指的是包含 lambda 表达式的对象,而不是使用 lambda 表达式创建的对象... (3认同)