JavaFX - 建议在 setLayoutX(x) 上使用 relocate(x,y) 移动对象,但我无法修改重定位参数 [重复]
Posted
技术标签:
【中文标题】JavaFX - 建议在 setLayoutX(x) 上使用 relocate(x,y) 移动对象,但我无法修改重定位参数 [重复]【英文标题】:JavaFX - advised to move object using relocate(x,y) over setLayoutX(x) yet I can't modify relocate parameters [duplicate] 【发布时间】:2017-08-11 09:49:30 【问题描述】:我检查了 API 如何更改图形对象的位置。我成功地使用了 setLayoutX 和 setLayoutY(它不断地对对象 x 和 y 进行标记),但他们建议我改用 relocate(x,y)。
我想做正确的代码,但问题是我不能使用 relocate(x,y) 来移动。如果我使用 30 作为参数,它可以工作。但我想使用可以让我移动对象的东西。我认为这就是 relocate() 的目的。
当我将参数设置为 x++ 或 x+=10 时,我收到此错误“从内部类引用的局部变量必须是最终的或有效的最终”。
代码:
public class LineClass extends DrawingLine
private final Group root;
private AnimationTimer timer;
//variable for storing actual frame
private Integer i = 0;
//main timeline
private Timeline timeline;
public LineClass()
int x = 100;
int y = 200;
Circle circle = new Circle(x,y,10);
root = new Group(circle);
//create a timeline for moving the circle
timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.setAutoReverse(true);
double xx = circle.getLayoutX();
//create a keyValue with factory: scaling the circle 2times
// KeyValue keyValueX = new KeyValue(circle.setLayoutX(3));
KeyValue keyValueX = new KeyValue(circle.scaleXProperty(), 2);
KeyValue keyValueY = new KeyValue(circle.scaleYProperty(), 2);
//create a keyFrame, the keyValue is reached at time 2s
Duration duration = Duration.millis(1000);
//one can add a specific action when the keyframe is reached
EventHandler onFinished = new EventHandler<ActionEvent>()
public void handle(ActionEvent t)
circle.relocate(30,30);
/* double xx = circle.getLayoutX();
circle.setLayoutX(xx+=10);
//reset counter
i = 0;*/
;
KeyFrame keyFrame = new KeyFrame(duration, onFinished , keyValueX, keyValueY);
timeline.getKeyFrames().add(keyFrame);
timeline.play();
//timer.start();
public Parent getView()
return root ;
提前致谢。
【问题讨论】:
为什么还要修改xx
?
@James_D 哦,我已经解决了这个问题。变量必须是局部的或最终的。所以我将它设置为局部变量,它将从 getLayoutX 中获取 x,然后它将使用 relocate(x+=10,y+=10)。每次我做 relocate() 时,LayoutX 都会自动继承正确的值(对象的 x 位置)。
为什么不直接做relocate(x+10, y+10)
?你为什么要首先修改这些变量(你似乎不再使用它们)?并且“变量必须是本地的或最终的”是不正确的。 lambda 表达式中引用的局部变量必须是 final 的。所以它不能是本地的和非最终的。
哦好吧有道理
【参考方案1】:
我现在已经解决了这个问题。
解决它的代码:
double x=circle.getLayoutX();
double y=circle.getLayoutY();
x+=10;
y+=10;
circle.relocate(x,y);
【讨论】:
以上是关于JavaFX - 建议在 setLayoutX(x) 上使用 relocate(x,y) 移动对象,但我无法修改重定位参数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章