Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 使用局部变量的JavaFX事件_Events_Variables_Javafx_Local_Final - Fatal编程技术网

Events 使用局部变量的JavaFX事件

Events 使用局部变量的JavaFX事件,events,variables,javafx,local,final,Events,Variables,Javafx,Local,Final,我有一个方法可以创建一个名为createImageView()的ImageView,它使用EventHanders调用各种事件。我希望能够在这个方法中使用局部变量。我通常做的是在handle(Event)方法中指定要使用的最终变量 在下面描述的方法中,当我使用final时,会出现以下错误: 无法分配最终局部变量initY,因为它是在封闭类型中定义的 无法分配最终局部变量initY,因为它是在封闭类型中定义的 无法指定最终局部变量dragAnchor,因为它是在封闭类型中定义的 当然,删除fina

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

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

无法分配最终局部变量initY,因为它是在封闭类型中定义的
无法分配最终局部变量initY,因为它是在封闭类型中定义的
无法指定最终局部变量dragAnchor,因为它是在封闭类型中定义的

当然,删除final给了我以下信息:

无法在其他方法中定义的内部类中引用非最终变量initX

那么,我该怎么做才能让这个方法起作用呢

private ImageView createImageView(){
双initX;
双重人格;
点2D dragAnchor;
imgView.setOnMousePressed(新事件处理程序(){
公共无效句柄(MouseEvent me){
//按下鼠标时,存储初始位置
initX=imgView.getTranslateX();
initY=imgView.getTranslateY();
dragAnchor=newpoint2d(me.getSceneX(),me.getSceneY());
我。消费();
}
});
imgView.setOnMouseDrawed(新事件处理程序(){
公共无效句柄(MouseEvent me){
double dragX=me.getSceneX()-dragAnchor.getX();
double dragY=me.getSceneY()-dragAnchor.getY();
双newXPosition=initX+dragX;
双新位置=initY+dragY;
imgView.setTranslateX(newXPosition);
imgView.setTranslateY(newYPosition);
我。消费();
}
});
imgView.setOnMouseCentered(新事件处理程序(){
公共无效句柄(MouseeEvent事件){
imgView.setEffect(新辉光(0.5));
event.consume();
}
});
imgView.setOnMouseExited(新事件处理程序(){
公共无效句柄(MouseeEvent事件){
imgView.setEffect(新辉光(0.0));
event.consume();
}
});
返回imgView;
}

我删除了3个局部变量,并将它们设置为类变量,这样就可以工作了。如果有人不介意提供一个快速的解释,我会很感激的。

使用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()
  )
);
final DoubleProperty initX=new SimpleDoubleProperty();
final ObjectProperty dragAnchor=新的SimpleObjectProperty();
...
//事件内处理程序
initX.set(
imageView.getTranslateX()
);
德拉甘索(
新点2D(
me.getSceneX(),
我
)
);

谢谢你。这对双打很有效,但德拉甘索仍然给我同样的问题。没什么大不了的,我下面的解决方案现在似乎还有效。更新的示例演示了如何将
ObjectProperty
用于
dragAnchor