动态更新 tornadofx 中的折线点

Dynamically updating Polyline points in tornadofx

这个问题有点简单,但我自己想不出来...我想做的是使用 JavaFX 时间线来更新我的折线点。到目前为止,我得到的信息如下:

class MainView : View("Hello TornadoFX") {
    var myLine: Polyline by singleAssign()
    val myTimeline = timeline {
        cycleCount = INDEFINITE
    }

    override val root = hbox {
        myLine = polyline(0.0, 0.0, 100.0, 100.0)
        myTimeline.apply {
            keyFrames += KeyFrame((1/10.0).seconds, {
                myLine.points.forEachIndexed { i, d ->
                    myLine.points[i] = d + 1
                }
                println(myLine.points)
            })
            play()
        }
    }
}

尽管点列表确实更新了值,如打印时所示,但更改并未反映在 ui 中。

非常感谢您的帮助!

我之前没有使用过 TornadoFX,所以我尝试使用普通的 JavaFX。点更新时,UI 似乎正在更新。问题可能与您使用 TornadoFX 的实施有关。

请检查下面的工作示例。

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Polyline;
import javafx.stage.Stage;
import javafx.util.Duration;

public class PolyLinePointsUpdateDemo extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        Pane root = new Pane();
        Scene scene = new Scene(root, 600,600);
        primaryStage.setScene(scene);
        primaryStage.setTitle("PolyLine Points Update");
        primaryStage.show();

        Polyline line = new Polyline(0.0, 0.0, 100.0, 100.0);
        root.getChildren().add(line);

        Timeline timeline = new Timeline();
        timeline.getKeyFrames().add(new KeyFrame(Duration.millis(250), e->{
            for (int i = 0; i < line.getPoints().size(); i++) {
                double d = line.getPoints().get(i);
                line.getPoints().set(i, d+1);
            }
            System.out.println(line.getPoints());
        }));
        timeline.setCycleCount(Animation.INDEFINITE);
        timeline.play();
    }

    public static void main(String... a){
        Application.launch(a);
    }
}

发现问题只是使用 hbox 作为父布局,而不是使用绝对坐标处理子元素定位的窗格。