【问题标题】:How to remove an event handler?如何删除事件处理程序?
【发布时间】:2016-12-07 19:31:12
【问题描述】:

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

我设置了一个事件处理程序来记录鼠标单击的 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);

【问题讨论】:

    标签: java javafx


    【解决方案1】:

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

    会是这样的

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

    【讨论】:

    • 应该注意,这不适用于 lambda 表达式。但是在这种情况下没有这样的问题......
    • @fabian,我对 java 8 中的 lambdas 没有太多经验,所以你能解释一下为什么这不起作用吗?
    • @user902383:在 lambda 中,this 指的是包含 lambda 表达式的对象,而不是使用 lambda 表达式创建的对象...
    猜你喜欢
    • 1970-01-01
    • 2010-11-21
    • 2010-10-22
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多