JavaFX LineChart Valores de desplazamiento

Estoy en el proceso de crear un gráfico de líneas en JavaFX. Todo está bien actualmente y crea con éxito la tabla con los datos que necesito de un procedimiento almacenado en la base de datos. De todos modos, lo que requiero si es posible es que cada punto de datos en el LineChart tenga un evento de desplazamiento sobre el mouse que indique el valor detrás del punto específico, por ejemplo £ 150,000. He visto ejemplos de esto en PieCharts, donde muestra el valor en% de vuelo estacionario pero no puedo encontrar ejemplos en ningún lugar para LineCharts, ¿se puede hacer esto?

¿Puede alguien señalarme en la dirección correcta si es posible?

Código hasta el momento:

private static final String MINIMIZED = "MINIMIZED"; private static final String MAXIMIZED = "MAXIMIZED"; private static String chartState = MINIMIZED; // 12 Month Sales Chart XYChart.Series series = new XYChart.Series(); XYChart.Series series2 = new XYChart.Series(); public void getDeltaData() { try { Connection con = DriverManager.getConnection(connectionUrl); //Get all records from table String SQL = ""; Statement stmt = con.createStatement(); //Create the result set from query execution. ResultSet rs = stmt.executeQuery(SQL); while (rs.next()) { series.getData().add(new XYChart.Data(rs.getString(1), Double.parseDouble(rs.getString(7)))); series2.getData().add(new XYChart.Data(rs.getString(1), Double.parseDouble(rs.getString(8)))); } rs.close(); stmt.close(); } catch (Exception e) { } yearChart = createChart(); } protected LineChart createChart() { final CategoryAxis xAxis = new CategoryAxis(); final NumberAxis yAxis = new NumberAxis(); // setup chart series.setName("Target"); series2.setName("Actual"); xAxis.setLabel("Period"); yAxis.setLabel("£"); yearChart.getData().add(series); yearChart.getData().add(series2); yearChart.setCreateSymbols(false); return yearChart; } 

La respuesta proporcionada por jewelsea es una solución perfecta para este problema.

Gracias, jewelsea.

Use XYChart.Data.setNode (hoverPane) para mostrar un nodo personalizado para cada punto de datos. Convierta el hoverNode en un contenedor como StackPane . Agregue detectores de eventos de mouse para que sepa cuándo el mouse entra y sale del nodo. Al ingresar, coloca una etiqueta para el valor dentro del hoverPane. Al salir, quite la etiqueta del hoverPane.

Hay un código de ejemplo para demostrar esta técnica.

La salida del código de muestra se muestra con el cursor sobre el nodo 22.

hoverednode

Usando información sobre herramientas:

 import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.TreeMap; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.chart.LineChart; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.chart.XYChart.Data; import javafx.scene.control.Tooltip; import javafx.stage.Stage; /** * * @author blj0011 */ public class JavaFXApplication250 extends Application { @Override public void start(Stage stage) { stage.setTitle("Line Chart Sample"); //defining the axes final NumberAxis xAxis = new NumberAxis(); final NumberAxis yAxis = new NumberAxis(); xAxis.setLabel("Number of Month"); //creating the chart final LineChart lineChart = new LineChart<>(xAxis, yAxis); lineChart.setTitle("Stock Monitoring, 2010"); //defining a series XYChart.Series series = new XYChart.Series(); series.setName("My portfolio"); //populating the series with data Random rand = new Random(); TreeMap data = new TreeMap(); //Create Chart data for (int i = 0; i < 3; i++) { data.put(rand.nextInt(51), rand.nextInt(51)); } Set set = data.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry me = (Map.Entry) i.next(); System.out.println(me.getKey() + " - " + me.getValue()); series.getData().add(new XYChart.Data(me.getKey(), me.getValue()));//Add data to series } lineChart.getData().add(series); //loop through data and add tooltip //THIS MUST BE DONE AFTER ADDING THE DATA TO THE CHART! for (Data entry : series.getData()) { entry.getNode().setOnMouseEntered(mousePressed -> { System.out.println("Entered!"); Tooltip t = new Tooltip(entry.getYValue().toString()); Tooltip.install(entry.getNode(), t); }); } Scene scene = new Scene(lineChart, 800, 600); stage.setScene(scene); stage.show(); } /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); } }