import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

/**
 *
 * @author molloc
 */
public class LineChartSample extends Application {
 
    @Override public void start(Stage stage) {
        stage.setTitle("Line Chart Sample");
        // Define the axes
        final NumberAxis xAxis = new NumberAxis();
        final NumberAxis yAxis = new NumberAxis();
        xAxis.setLabel("Month Number");
        // Create the chart
        final LineChart<Number,Number> lineChart =
                new LineChart<Number,Number>(xAxis,yAxis);
        lineChart.setTitle("Stock Monitoring, 2010");
        // Define a series
        XYChart.Series series = new XYChart.Series();
        series.setName("My portfolio");
        // Populating the series with data
        series.getData().add(new XYChart.Data(1, 23));
        series.getData().add(new XYChart.Data(2, 14));
        series.getData().add(new XYChart.Data(3, 15));
        series.getData().add(new XYChart.Data(4, 24));
        series.getData().add(new XYChart.Data(5, 34));
        series.getData().add(new XYChart.Data(6, 36));
        series.getData().add(new XYChart.Data(7, 22));
        series.getData().add(new XYChart.Data(8, 45));
        series.getData().add(new XYChart.Data(9, 43));
        series.getData().add(new XYChart.Data(10, 17));
        series.getData().add(new XYChart.Data(11, 29));
        series.getData().add(new XYChart.Data(12, 25));
        
        BorderPane bdrPane = new BorderPane();
        bdrPane.setCenter(lineChart);
        
        Button removeAddBtn = new Button();
        removeAddBtn.setText("Remove/Add Series");
        removeAddBtn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent t) {
                ObservableList<Series<Number, Number>> data = lineChart.getData();
                Series<Number, Number> removedSeries = data.remove(0);
                
                // The following causes an IllegalArgumentException: duplicate
                // children added
                //data.add(removedSeries);
                
                // The following also causes an IllegalArgumentException
                Series<Number, Number> newSeries = new Series<>(removedSeries.getData());
                data.add(newSeries);
            }
        });
        bdrPane.setBottom(removeAddBtn);
        
        Scene scene = new Scene(bdrPane, 800, 600);
        lineChart.getData().add(series);
       
        stage.setScene(scene);
        stage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
}