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);
我正在尝试向 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);