Como adicionar um marcador de valor ao gráfico JavaFX?

Eu estou tentando construir um gráfico de série usando o JavaFX, onde os dados são inseridos dinamicamente.

Toda vez que um novo valor é inserido, gostaria de verificar se esse é o valor mais alto até o momento e, em caso afirmativo, quero desenhar uma linha horizontal para mostrar que esse é o valor máximo.

No gráfico do JFree eu teria usado um ValueMarker, mas estou tentando fazer o mesmo com o JavaFX.

Eu tentei usar o object de linha, mas definitivamente não é o mesmo, porque eu não posso fornecer os valores de gráfico, leva as posições de pixel relativas nas janelas.

Aqui está a captura de canvas do gráfico que desejo alcançar:

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

Alguma sugestão? Obrigado.

Para converter valores de gráfico em pixels, você pode usar o método NumberAxis#getDisplayPosition() que retorna as coordenadas reais dos nós do gráfico.

Embora essas coordenadas sejam relativas à área do gráfico, você pode descobrir pelo próximo código:

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

Observe o método localToScene() , que permite converter quaisquer coordenadas para as cenas. Assim, você pode usá-los para atualizar suas coordenadas do marcador de valor. Certifique-se de fazer localToScene chamada localToScene depois que sua cena tiver sido exibida.

Veja o exemplo de programa abaixo que produz o próximo gráfico:

insira a descrição da imagem aqui

 public class LineChartValueMarker extends Application { private Line valueMarker = new Line(); private XYChart.Series series = new XYChart.Series<>(); private NumberAxis yAxis; private double yShift; private void updateMarker() { // find maximal y value double max = 0; for (Data 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 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() { @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(); } }