0

我有一个创建 ImageView 的方法,称为 createImageView(),它使用 EventHanlders 来调用各种事件。我希望能够在这种方法中使用局部变量。我通常做的是分配最终变量以在 handle(Event) 方法中使用。

在下面描述的方法中,当我使用 final 时,会出现以下错误:

最终局部变量 initY 无法赋值,因为它定义在封闭类型
中 最终局部变量 initY 无法赋值,因为它定义在封闭类型
中 最终局部变量 dragAnchor 无法赋值,因为它定义在封闭类型中类型

当然,删除 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;
}
4

2 回答 2

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()
  )
);
于 2013-04-13T01:45:03.263 回答
0

我删除了 3 个局部变量并将它们设为类变量并且它起作用了。如果有人不介意提供一个快速解释,我将不胜感激。

于 2013-04-13T00:43:50.167 回答