73 super(xAxis, yAxis);
74 if (!(xAxis instanceof ValueAxis && yAxis instanceof ValueAxis)) {
75 throw new IllegalArgumentException("Axis type incorrect, X and Y should both be NumberAxis");
76 }
77 setData(data);
78 }
79
80 // -------------- METHODS ------------------------------------------------------------------------------------------
81
82 /**
83 * Used to get a double value from a object that can be a Number object or null
84 *
85 * @param number Object possibly a instance of Number
86 * @param nullDefault What value to return if the number object is null or not a Number
87 * @return number converted to double or nullDefault
88 */
89 private static double getDoubleValue(Object number, double nullDefault) {
90 return !(number instanceof Number) ? nullDefault : ((Number)number).doubleValue();
91 }
92
93 /** @inheritDoc */
94 @Override protected void layoutPlotChildren() {
95 // update bubble positions
96 for (int seriesIndex=0; seriesIndex < getDataSize(); seriesIndex++) {
97 Series<X,Y> series = getData().get(seriesIndex);
98 // for (Data<X,Y> item = series.begin; item != null; item = item.next) {
99 Iterator<Data<X,Y>> iter = getDisplayedDataIterator(series);
100 while(iter.hasNext()) {
101 Data<X,Y> item = iter.next();
102 double x = getXAxis().getDisplayPosition(item.getCurrentX());
103 double y = getYAxis().getDisplayPosition(item.getCurrentY());
104 if (Double.isNaN(x) || Double.isNaN(y)) {
105 continue;
106 }
107 Node bubble = item.getNode();
108 Ellipse ellipse;
109 if (bubble != null) {
110 if (bubble instanceof StackPane) {
111 StackPane region = (StackPane)item.getNode();
112 if (region.getShape() == null) {
113 ellipse = new Ellipse(getDoubleValue(item.getExtraValue(), 1), getDoubleValue(item.getExtraValue(), 1));
150 }
151
152 @Override protected void dataItemRemoved(final Data<X,Y> item, final Series<X,Y> series) {
153 final Node bubble = item.getNode();
154 if (shouldAnimate()) {
155 // fade out old bubble
156 FadeTransition ft = new FadeTransition(Duration.millis(500),bubble);
157 ft.setToValue(0);
158 ft.setOnFinished(actionEvent -> {
159 getPlotChildren().remove(bubble);
160 removeDataItemFromDisplay(series, item);
161 bubble.setOpacity(1.0);
162 });
163 ft.play();
164 } else {
165 getPlotChildren().remove(bubble);
166 removeDataItemFromDisplay(series, item);
167 }
168 }
169
170 /** @inheritDoc */
171 @Override protected void dataItemChanged(Data<X, Y> item) {
172 }
173
174 @Override protected void seriesAdded(Series<X,Y> series, int seriesIndex) {
175 // handle any data already in series
176 for (int j=0; j<series.getData().size(); j++) {
177 Data<X,Y> item = series.getData().get(j);
178 Node bubble = createBubble(series, seriesIndex, item, j);
179 if (shouldAnimate()) {
180 bubble.setOpacity(0);
181 getPlotChildren().add(bubble);
182 // fade in new bubble
183 FadeTransition ft = new FadeTransition(Duration.millis(500),bubble);
184 ft.setToValue(1);
185 ft.play();
186 } else {
187 getPlotChildren().add(bubble);
188 }
189 }
190 }
|
73 super(xAxis, yAxis);
74 if (!(xAxis instanceof ValueAxis && yAxis instanceof ValueAxis)) {
75 throw new IllegalArgumentException("Axis type incorrect, X and Y should both be NumberAxis");
76 }
77 setData(data);
78 }
79
80 // -------------- METHODS ------------------------------------------------------------------------------------------
81
82 /**
83 * Used to get a double value from a object that can be a Number object or null
84 *
85 * @param number Object possibly a instance of Number
86 * @param nullDefault What value to return if the number object is null or not a Number
87 * @return number converted to double or nullDefault
88 */
89 private static double getDoubleValue(Object number, double nullDefault) {
90 return !(number instanceof Number) ? nullDefault : ((Number)number).doubleValue();
91 }
92
93 /** {@inheritDoc} */
94 @Override protected void layoutPlotChildren() {
95 // update bubble positions
96 for (int seriesIndex=0; seriesIndex < getDataSize(); seriesIndex++) {
97 Series<X,Y> series = getData().get(seriesIndex);
98 // for (Data<X,Y> item = series.begin; item != null; item = item.next) {
99 Iterator<Data<X,Y>> iter = getDisplayedDataIterator(series);
100 while(iter.hasNext()) {
101 Data<X,Y> item = iter.next();
102 double x = getXAxis().getDisplayPosition(item.getCurrentX());
103 double y = getYAxis().getDisplayPosition(item.getCurrentY());
104 if (Double.isNaN(x) || Double.isNaN(y)) {
105 continue;
106 }
107 Node bubble = item.getNode();
108 Ellipse ellipse;
109 if (bubble != null) {
110 if (bubble instanceof StackPane) {
111 StackPane region = (StackPane)item.getNode();
112 if (region.getShape() == null) {
113 ellipse = new Ellipse(getDoubleValue(item.getExtraValue(), 1), getDoubleValue(item.getExtraValue(), 1));
150 }
151
152 @Override protected void dataItemRemoved(final Data<X,Y> item, final Series<X,Y> series) {
153 final Node bubble = item.getNode();
154 if (shouldAnimate()) {
155 // fade out old bubble
156 FadeTransition ft = new FadeTransition(Duration.millis(500),bubble);
157 ft.setToValue(0);
158 ft.setOnFinished(actionEvent -> {
159 getPlotChildren().remove(bubble);
160 removeDataItemFromDisplay(series, item);
161 bubble.setOpacity(1.0);
162 });
163 ft.play();
164 } else {
165 getPlotChildren().remove(bubble);
166 removeDataItemFromDisplay(series, item);
167 }
168 }
169
170 /** {@inheritDoc} */
171 @Override protected void dataItemChanged(Data<X, Y> item) {
172 }
173
174 @Override protected void seriesAdded(Series<X,Y> series, int seriesIndex) {
175 // handle any data already in series
176 for (int j=0; j<series.getData().size(); j++) {
177 Data<X,Y> item = series.getData().get(j);
178 Node bubble = createBubble(series, seriesIndex, item, j);
179 if (shouldAnimate()) {
180 bubble.setOpacity(0);
181 getPlotChildren().add(bubble);
182 // fade in new bubble
183 FadeTransition ft = new FadeTransition(Duration.millis(500),bubble);
184 ft.setToValue(1);
185 ft.play();
186 } else {
187 getPlotChildren().add(bubble);
188 }
189 }
190 }
|