java - 在线程 "JavaFX Application Thread"中获取异常,并具有时间线关键帧的重复子项

标签 java javafx

我知道 Polyline sine = new Polyline(); 导致了错误,因为它试图为已经存在的东西创建一个新的类实例。如何清除每个关键帧的实例或在方法外部声明折线而不创建对角线及其创建的正弦波? My Full Code

public BallOnCurvePane() {
        // Create an animation for moving the ball
        animation = new Timeline(
                new KeyFrame(Duration.millis(50), e -> moveBall()));
        animation.setCycleCount(Timeline.INDEFINITE);
        animation.play();
    }

protected void moveBall() {
        Polyline sine = new Polyline();
        ObservableList<Double> list = sine.getPoints();
        for (double x = -170.0; x <= 170.0; x++) {
            list.add(x + 200.0);
            list.add(80.0 - 50.0 * Math.sin((x / 100.0) * 2.0 * (double) Math.PI));
        }
        circle.setFill(ballColor);
        getChildren().addAll(sine, circle);

        pt.setRate(.25);
        pt.setPath(sine);
        pt.setNode(circle);
        pt.setCycleCount(Timeline.INDEFINITE);
        pt.setAutoReverse(true);
        pt.play();

    }

我的完整错误

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = BallOnCurvePane@13424ecf
    at javafx.scene.Parent$2.onProposedChange(Parent.java:454)
    at com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:234)
    at com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:103)
    at BallOnCurvePane.moveBall(BallOnCurvePane.java:68)
    at BallOnCurvePane.lambda$new$0(BallOnCurvePane.java:25)
    at com.sun.scenario.animation.shared.TimelineClipCore.visitKeyFrame(TimelineClipCore.java:239)
    at com.sun.scenario.animation.shared.TimelineClipCore.playTo(TimelineClipCore.java:180)
    at javafx.animation.Timeline.impl_playTo(Timeline.java:176)
    at javafx.animation.AnimationAccessorImpl.playTo(AnimationAccessorImpl.java:39)
    at com.sun.scenario.animation.shared.InfiniteClipEnvelope.timePulse(InfiniteClipEnvelope.java:110)
    at javafx.animation.Animation.impl_timePulse(Animation.java:1102)
    at javafx.animation.Animation$1.lambda$timePulse$25(Animation.java:186)
    at java.security.AccessController.doPrivileged(Native Method)
    at javafx.animation.Animation$1.timePulse(Animation.java:185)
    at com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:344)
    at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:267)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:506)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
    at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)

最佳答案

线路

getChildren().addAll(sine, circle);

每次添加相同的实例。无需多次添加节点。 此外,由于折线仅代表球应采取的路径,因此无需将其添加为子项(除非您想绘制路径并沿其移动圆)。

关于java - 在线程 "JavaFX Application Thread"中获取异常,并具有时间线关键帧的重复子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37083634/

相关文章:

java - 如何检查 Java 派生类型是否是当前调用堆栈的一部分?

java - 使用 JDBC 从 ORACLE 获取 CLOB 数据时出现 NotSerializedException

java - 在 main() 中记录 Throwable

java - 如何跟踪/调试 Apache Camel 或 AOP 修改的代码?

java - 单击按钮后,如何使文本字段可编辑 10 秒?

css - 无法在 javafx 8 中加载 css 文件

binding - 是否可以使用 JavaFX HTMLEditor 的绑定(bind)

java - 事件溯源中的乐观锁机制 "UNDO"流程

针对 Java 8 构建的 JavaFX 应用程序 - 如何在 Java 11 上保持运行?

JavaFX 图表 - Java.lang.IllegalArgumentException : Duplicate series added