我有一个创建ImageView的方法,名为createImageView(),它使用EventHanlders来调用vaious事件。我希望能够在此方法中使用局部变量。我通常做的是分配在句柄(Event)方法中使用的最终变量。
在下面描述的方法中,当我使用final时,我会收到以下错误:
无法分配最终的局部变量initY,因为它是在封闭类型中定义的 无法分配最终的局部变量initY,因为它是在封闭类型中定义的 无法分配最终的局部变量dragAnchor,因为它是在封闭类型中定义的
当然,删除final会给我这样的信息:
不能在不同方法
中定义的内部类中引用非final变量initX
那么我需要做些什么来使这个方法有效呢?
private ImageView createImageView() {
double initX;
double initY;
Point2D dragAnchor;
imgView.setOnMousePressed(new EventHandler < MouseEvent > () {
public void handle(MouseEvent me) {
//when mouse is pressed, store initial position
initX = imgView.getTranslateX();
initY = imgView.getTranslateY();
dragAnchor = new Point2D(me.getSceneX(), me.getSceneY());
me.consume();
}
});
imgView.setOnMouseDragged(new EventHandler < MouseEvent > () {
public void handle(MouseEvent me) {
double dragX = me.getSceneX() - dragAnchor.getX();
double dragY = me.getSceneY() - dragAnchor.getY();
double newXPosition = initX + dragX;
double newYPosition = initY + dragY;
imgView.setTranslateX(newXPosition);
imgView.setTranslateY(newYPosition);
me.consume();
}
});
imgView.setOnMouseEntered(new EventHandler < MouseEvent > () {
public void handle(MouseEvent event) {
imgView.setEffect(new Glow(0.5));
event.consume();
}
});
imgView.setOnMouseExited(new EventHandler < MouseEvent > () {
public void handle(MouseEvent event) {
imgView.setEffect(new Glow(0.0));
event.consume();
}
});
return imgView;
}
答案 0 :(得分:1)
使用JavaFX属性而不是基本类型。
例如:
final DoubleProperty initX = new SimpleDoubleProperty();
final ObjectProperty<Point2D> dragAnchor = new SimpleObjectProperty<>();
...
// in event handler
initX.set(
imageView.getTranslateX()
);
dragAnchor.set(
new Point2D(
me.getSceneX(),
me.getSceneY()
)
);
答案 1 :(得分:0)
我删除了3个局部变量并使它们成为类变量并且它有效。如果有人不介意提供一个快速的解释,为什么我会欣赏它。