问题描述
这个问题有点简单,但我自己想不通……我想要做的是使用 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 作为父布局,而不是使用绝对坐标处理儿童定位的窗格。