2016-05-07 7 views
0

ポリラインsine = new Polyline();は、既に存在するものの新しいクラスインスタンスを作成しようとしているため、このエラーの原因となります。インスタンスをキーフレームごとにクリアするか、作成した正弦波とともに対角線を作成せずに、メソッド外のポリラインを宣言するにはどうすればよいですか? My Full Codeスレッド "JavaFXアプリケーションスレッド"で例外を取得するタイムラインキーフレームの子を複製する

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 = [email protected] 
    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) 

答えて

1

ライン

getChildren().addAll(sine, circle); 

circle毎回の同じインスタンスを追加します。ノードを複数回追加する必要はありません。 さらに、ポリラインはボールが取り込むべきパスを表しているだけなので、子を追加する必要はありません(パスを描画し、それに沿って円を移動しない限り)。

関連する問題