JavaFX从lambda表达式中删除事件处理程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaFX从lambda表达式中删除事件处理程序相关的知识,希望对你有一定的参考价值。

我正在尝试向画布添加事件处理程序,当满足条件时,该画布将自身删除。

我尝试这样做,但出现错误,提示该变量可能尚未初始化。

EventHandler<MouseEvent> canvasHandler = e -> 
        double x = e.getX();
        double y = e.getY();

        boolean last = false;

        if (Math.abs(x - lastX) < 20f) x = lastX;
        if (Math.abs(y - lastY) < 20f) y = lastY;

        if (points.size() > 2) 
            if (Math.abs(x - points.get(0).getKey()) < 20f && Math.abs(y - points.get(0).getValue()) < 20f) 
                x = points.get(0).getKey();
                y = points.get(0).getValue();
                last = true;
            
        

        points.add(new Pair<Double, Double>(x, y));

        lastX = x;
        lastY = y;

        gc.lineTo(x, y);

        if (!last) 
            gc.strokeOval(x - 5f, y - 5f, 10f, 10f);
        else
            canvas.removeEventHandler(MouseEvent.MOUSE_CLICKED, canvasHandler);


        gc.stroke();
    ;

    canvas.addEventHandler(MouseEvent.MOUSE_CLICKED, canvasHandler);
答案

如果使用匿名类而不是lambda,则可以从EventHandler方法内部使用this引用handle

EventHandler<MouseEvent> canvasHandler = new EventHandler<>() 
  @Override public void handle(MouseEvent event) 
    // handle event...
    if (/* condition */) 
      canvas.removeEventHandler(MouseEvent.MOUSE_CLICKED, this);
);
canvas.addEventHandler(MouseEvent.MOUSE_CLICKED, canvasHandler);

以上是关于JavaFX从lambda表达式中删除事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章

如何对JavaFX lambda表达式进行反向工程并获取EventHandler和ActionListener的类定义

JAVA 8 Lambda表达式-Lambda Expressions

JavaFX:在 UI 屏幕之间导航的最佳实践

将 lambda 表达式用于事件处理程序的最佳实践

如何向JavaFX选项卡添加多个选项卡关闭事件处理程序?

无操作 lambda