2016-07-14 2 views
2

Я использую метод удаления данных из диаграммы с помощью метода clear().Диаграмма JavaFX - Java.lang.IllegalArgumentException: Добавлена ​​повторяющаяся серия

@FXML 
public void restartButtonClicked() { 
    System.out.println("Restarting..."); 
    timeLine.getKeyFrames().clear(); 

    axesTest.getData().clear(); 
} 

В этой функции, но кнопки сразу получить нажал - он работает .. но второй раз, пока я буду нажмите на нее, она бросить исключение:

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Duplicate series added 
    at javafx.scene.chart.XYChart.lambda$new$550(Unknown Source) 
    at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(Unknown Source) 
    at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source) 
    at javafx.collections.ObservableListBase.fireChange(Unknown Source) 
    at javafx.collections.ListChangeBuilder.commit(Unknown Source) 
    at javafx.collections.ListChangeBuilder.endChange(Unknown Source) 
    at javafx.collections.ObservableListBase.endChange(Unknown Source) 
    at javafx.collections.ModifiableObservableListBase.addAll(Unknown Source) 
    at sample.Controller.startButtonClicked(Controller.java:138) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at sun.reflect.misc.Trampoline.invoke(Unknown Source) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at sun.reflect.misc.MethodUtil.invoke(Unknown Source) 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(Unknown Source) 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(Unknown Source) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source) 
    at javafx.event.Event.fireEvent(Unknown Source) 
    at javafx.scene.Node.fireEvent(Unknown Source) 
    at javafx.scene.control.Button.fire(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(Unknown Source) 
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source) 
    at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source) 
    at javafx.event.Event.fireEvent(Unknown Source) 
    at javafx.scene.Scene$MouseHandler.process(Unknown Source) 
    at javafx.scene.Scene$MouseHandler.access$1500(Unknown Source) 
    at javafx.scene.Scene.impl_processMouseEvent(Unknown Source) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(Unknown Source) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source) 
    at com.sun.glass.ui.View.handleMouseEvent(Unknown Source) 
    at com.sun.glass.ui.View.notifyMouse(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Таким образом, проблема находится в 138 строке, а также в 159 строке кода из метода:

@SuppressWarnings("unchecked") 
@FXML 
public void startButtonClicked(ActionEvent event) { 
if (comboBox.getValue() == null) { 
    System.out.print("Nie wybrano opcji."); 
} else { 
    if(comboBox.getValue().equals("Gaussian Wave : non-Dispersive")) { 
     System.out.println("Gaussian Wave : non-Dispersive"); 
     axesTest.setTitle("Gaussian Wave : non-Dispersive"); 

     series.setName("bla"); 
     series1.setName("ssad"); 
     series2.setName("asf"); 

     seriesList.add(series); 
     seriesList.add(series1); 
     seriesList.add(series2); 

     timeLine = new Timeline(); 
     gaussianWave = new GaussianWave(seriesList, axes, timeLine); 
     seriesList = gaussianWave.draw(); 
     gaussianWave.update(axesTest); 

     axesTest.getData().retainAll(); 
     axesTest.getData().addAll(seriesList); 
    } else if(comboBox.getValue().equals("Gaussian Wave : Dispersive")) { 
     System.out.println("Gaussian Wave : Dispersive"); 
     axesTest.setTitle("Gaussian Wave : Dispersive"); 

     series.setName("bla"); 
     series1.setName("ssad"); 
     series2.setName("asf"); 

     seriesList.add(series); 
     seriesList.add(series1); 
     seriesList.add(series2); 

     timeLine = new Timeline(); 
     gaussianWaveDispersive = new GaussianWaveDispersive(seriesList, axes, timeLine); 
     seriesList = gaussianWaveDispersive.draw(); 
     gaussianWaveDispersive.update(axesTest); 

     axesTest.getData().retainAll(); 
     axesTest.getData().addAll(seriesList); 
    } 
} 

}

и проблема заключается в:

axesTest.getData().addAll(seriesList); 

Почему я получаю это исключение после очистки всех данных с графика? Как я могу это исправить?

ответ

3

Снят ObservableList хранится в dataProperty в Series: (?)

axesTest.getData().clear(); 

но использовать промежуточный список называется seriesList, а не добавлять Data непосредственно:

seriesList.add(series); 
seriesList.add(series1); 
seriesList.add(series2) 

... 

axesTest.getData().addAll(seriesList); 

Проблема вы не очищаете seriesList перед добавлением элементов, поэтому он содержит элементы во втором клике дважды, что приведет к IllegalArgumentException.

На самом деле я не знаю, что здесь происходит:

gaussianWave = new GaussianWave(seriesList, axes, timeLine); 
seriesList = gaussianWave.draw(); 

но мне кажется, что seriesList содержит предыдущие Data объекты после этих строк.

+0

Да, у вас есть право! Не удалось очистить данные 'seriesList'. Эти 2 строки, которые вы имеете в виду, хранят 'Данные' для' axesTest'. – yerpy

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