piechart pie graficas chart java charts javafx-2 javafx

pie - ¿Cómo agregar un marcador de valor al gráfico JavaFX?



pie chart in javafx (1)

Intento crear un gráfico de series usando JavaFX, donde los datos se insertan dinámicamente.

Cada vez que se inserta un nuevo valor, me gustaría verificar si este es el valor más alto hasta el momento, y si es así, quiero dibujar una línea horizontal para mostrar que este es el valor máximo.

En el diagrama de JFree habría usado un ValueMarker, pero estoy tratando de hacer lo mismo con JavaFX.

Intenté usar el objeto Line, pero definitivamente no es lo mismo, porque no puedo proporcionar los valores Chart, toma las posiciones relativas de los píxeles en las ventanas.

Aquí está la captura de pantalla del gráfico que quiero lograr:

http://postimg.org/image/s5fkupsuz/

¿Alguna sugerencia? Gracias.


Para convertir los valores de gráfico a píxeles, puede usar el método NumberAxis#getDisplayPosition() que devuelve las coordenadas reales de los nodos del gráfico.

Aunque estas coordenadas son relativas al área de gráfico, que puede encontrar en el siguiente código:

Node chartArea = chart.lookup(".chart-plot-background"); Bounds chartAreaBounds = chartArea.localToScene(chartArea.getBoundsInLocal());

Tenga en localToScene() método localToScene() que le permite convertir cualquier coordenadas en Escenas. Por lo tanto, puede usarlos para actualizar sus coordenadas de marcador de valor. Asegúrese de hacer localToScene llamada a localToScene después de que se haya mostrado su escena.

Vea el programa de ejemplo a continuación que produce la siguiente tabla:

public class LineChartValueMarker extends Application { private Line valueMarker = new Line(); private XYChart.Series<Number, Number> series = new XYChart.Series<>(); private NumberAxis yAxis; private double yShift; private void updateMarker() { // find maximal y value double max = 0; for (Data<Number, Number> value : series.getData()) { double y = value.getYValue().doubleValue(); if (y > max) { max = y; } } // find pixel position of that value double displayPosition = yAxis.getDisplayPosition(max); // update marker valueMarker.setStartY(yShift + displayPosition); valueMarker.setEndY(yShift + displayPosition); } @Override public void start(Stage stage) { LineChart<Number, Number> chart = new LineChart<>(new NumberAxis(0, 100, 10), yAxis = new NumberAxis(0, 100, 10)); series.getData().add(new XYChart.Data(0, 0)); series.getData().add(new XYChart.Data(10, 20)); chart.getData().addAll(series); Pane pane = new Pane(); pane.getChildren().addAll(chart, valueMarker); Scene scene = new Scene(pane); // add new value on mouseclick for testing chart.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent t) { series.getData().add(new XYChart.Data(series.getData().size() * 10, 30 + 50 * new Random().nextDouble())); updateMarker(); } }); stage.setScene(scene); stage.show(); // find chart area Node Node chartArea = chart.lookup(".chart-plot-background"); Bounds chartAreaBounds = chartArea.localToScene(chartArea.getBoundsInLocal()); // remember scene position of chart area yShift = chartAreaBounds.getMinY(); // set x parameters of the valueMarker to chart area bounds valueMarker.setStartX(chartAreaBounds.getMinX()); valueMarker.setEndX(chartAreaBounds.getMaxX()); updateMarker(); } public static void main(String[] args) { launch(); } }