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) 移动对象,但我无法修改重定位参数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX中GridPane的行居中对齐

JavaFX 本机捆绑图标 OS X

是否存在阻止 JavaFX 在虚拟化 OS X 环境中运行的已知不兼容性?

JavaFx与TornadoFx

在javaFX 3D项目中使用文件与代码

如何在 JavaFX 中获得一个阶段的关闭事件?