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
删除自身之前重新分配该字段的风险。