JavaFX从lambda表达式中删除eventhandler

JavaFX从lambda表达式中删除eventhandler,javafx,lambda,eventhandler,Javafx,Lambda,Eventhandler,我试图向画布中添加一个事件处理程序,当条件满足时,它会自动删除 我试过这样做,但是我得到一个错误,它说变量可能还没有初始化 EventHandler<MouseEvent> canvasHandler = e -> { double x = e.getX(); double y = e.getY(); boolean last = false; if (Math.abs(x - lastX) < 20f)

我试图向画布中添加一个事件处理程序,当条件满足时,它会自动删除

我试过这样做,但是我得到一个错误,它说变量可能还没有初始化

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);
EventHandler canvasHandler=e->{
双x=e.getX();
双y=e.getY();
布尔值last=false;
如果(数学abs(x-lastX)<20f)x=lastX;
如果(数学abs(y-lastY)<20f)y=lastY;
如果(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=点。get(0)。getValue();
last=真;
}
}
添加(新的一对(x,y));
lastX=x;
lastY=y;
gc.lineTo(x,y);
如果(!last)
gc.strokeova(x-5f,y-5f,10f,10f);
其他的
canvas.removeEventHandler(单击MouseEvent.MOUSE_,canvasHandler);
gc.stroke();
};
canvas.addEventHandler(MouseEvent.MOUSE_单击,canvasHandler);

如果使用匿名类而不是lambda,则可以从
句柄
方法内部使用
this
引用
事件处理程序

EventHandler canvashHandler=neweventhandler(){
@重写公共无效句柄(MouseeEvent事件){
//处理事件。。。
如果(/*条件*/){
canvas.removeventhandler(MouseEvent.MOUSE_单击,此选项);
});
canvas.addEventHandler(MouseEvent.MOUSE_单击,canvasHandler);

如果使用匿名类而不是lambda,则可以从
句柄
方法内部使用
this
引用
事件处理程序

EventHandler canvashHandler=neweventhandler(){
@重写公共无效句柄(MouseeEvent事件){
//处理事件。。。
如果(/*条件*/){
canvas.removeventhandler(MouseEvent.MOUSE_单击,此选项);
});
canvas.addEventHandler(MouseEvent.MOUSE_单击,canvasHandler);

我知道这个选项。但是对lambda表达式不可能这样做吗?如果
canvasHandler
是一个局部变量,那么就不可能。除非您想将实例包装到另一个对象中,例如
AtomicReference
或数组中;但是,在我看来,这个选项与匿名类一样冗长,但不是很清楚。如果将
canvasHandler
设置为一个字段,则可以从lambda内部引用该字段,但如果在声明中初始化该字段,则不能引用该字段。使用字段也会带来在
EventHandler
可以删除自身之前重新分配该字段的风险。我知道该选项。但不可能这样做吗与lambda表达式相同?如果
canvashHandler
是一个局部变量,则为否。除非您希望将实例包装在另一个对象中,例如
AtomicReference
或数组中;但是,在我看来,该选项与匿名类一样冗长,但不那么清晰。如果您将
canvashHandler
设置为一个字段,则您可以从lambda内部引用该字段,但如果您在声明中初始化该字段,则不能引用该字段。使用字段还会带来在
EventHandler
删除自身之前重新分配该字段的风险。