2016-05-07 1 views
0

Я понимаю, что Polyline sine = new Polyline(); вызывает ошибку, потому что она пытается создать экземпляр нового класса того, что уже существует. Как я могу очистить экземпляр каждого ключевого кадра или объявить полилинию вне метода, не создавая диагональную линию вместе с синусоидальной волной, которую она создает? My Full CodeПолучить исключение в потоке «JavaFX Application Thread» дубликат ребенка с временными ключевыми кадрами

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 каждый раз. Нет необходимости добавлять узел несколько раз. Кроме того, поскольку полилиния представляет только путь, который должен пройти шар, нет необходимости добавлять его в качестве ребенка (если вы не хотите рисовать путь, а также перемещать круг вдоль него).

Смежные вопросы