package de.panbytes.playground; 

import javafx.application.Application; 
import javafx.beans.property.ListProperty; 
import javafx.beans.property.SimpleListProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.ScatterChart; 
import javafx.scene.chart.XYChart; 
import javafx.scene.chart.XYChart.Data; 
import javafx.scene.chart.XYChart.Series; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

import java.util.ArrayList; 

public class ChartPropertyBug extends Application { 

  public static void main(final String[] args) { 
    launch(args); 
  } 

  @Override 
  public void start(final Stage primaryStage) throws Exception { 

    final Series<Number, Number> series = new Series<>(); 
    series.getData().add(new Data<>(1, 1)); 


    final ObservableList<Series<Number, Number>> seriesList = 
        FXCollections.observableList(new ArrayList<>()); 

    /* 
     * this doesn't work with correct binding 
     */ 
    final ListProperty<Series<Number, Number>> seriesProperty = 
        new SimpleListProperty<>(seriesList); 

    /* 
     * this works 
     */ 
    // final ObjectProperty<ObservableList<Series<Number, Number>>> seriesProperty = 
    // new SimpleObjectProperty<>(seriesList); 


    final XYChart<Number, Number> chart = new ScatterChart<>(new NumberAxis(), new NumberAxis()); 

    /* 
     * correct binding 
     */ 
    chart.dataProperty().bind(seriesProperty); 

    /* 
     * inverted binding - works unexpectedly 
     */ 
    // seriesProperty.bind(chart.dataProperty()); 

    /* 
     * modification 
     */ 
    seriesProperty.get().add(series); 


    final BorderPane root = new BorderPane(chart); 
    primaryStage.setScene(new Scene(root, 400, 400)); 
    primaryStage.show(); 
  } 

} 