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

JavaFX remove eventhandler from lambda expression

我正在尝试向 canvas 添加一个事件处理程序,它会在满足条件时自行删除。

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

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

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

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