1

This is my controller java class where am plotting line chart with multiple series and multiple values dynamically X-category axis and Y is Number axis and I want to show the values while hovering on the points. How can I do this as I have multiple series and multiple values

Stage stage = new Stage();

stage.setTitle("Performance Analysis");

final CategoryAxis xAxis = new CategoryAxis();
    final NumberAxis yAxis = new NumberAxis();

    xAxis.setLabel("Values");
    //yAxis.setLabel("Engines");

    LineChart<String, Number> lineChart = new LineChart<String,Number>(xAxis,yAxis);

    Scene scene  = new Scene(lineChart,800,600); 

    lineChart.setTitle("Performance Analysis");

    lineChart.setCursor(Cursor.CROSSHAIR);

     ParameterSelectionController psc = new ParameterSelectionController();


     performance performvalues = new performance(lineChart, refined, collection, al4); //this is another class which in parameter

     performvalues.generateChart();

     stage.setScene(scene);
     stage.show();

1 Answers1

3

I have seen your previous question and regarding this i have post below answer.

In same as this example you can create chart.XYChart.Data object and using HoveredThresholdNodea class constructor to set a node in particular point like this way

Change the generateChart() Method and create HoveredThresholdNodea class in performance.java class as:

@SuppressWarnings({ "unchecked", "rawtypes" })
public void generateChart() {
    for (int i = 0; i < engines.size(); i++) {
        XYChart.Series series = new XYChart.Series();
        series.setName(engines.get(i).toString());
        for (int j = 0; j < parameters.size(); j++) {
            final Data<String, Object> data = new XYChart.Data<>(parameters.get(j).toString(), param.get(i).get(j));
            data.setNode(new HoveredThresholdNodea(engines.get(i).toString(), param.get(i).get(j)));
            series.getData().add(data);
        }
        lineChart.getData().add(series);
        System.out.println(lineChart);
    }
}

class HoveredThresholdNodea extends StackPane {

    public HoveredThresholdNodea(String string, Object object) {
        setPrefSize(15, 15);

        final Label label = createDataThresholdLabel(string, object);

        setOnMouseEntered(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                getChildren().setAll(label);
                setCursor(Cursor.NONE);
                toFront();
            }
        });
        setOnMouseExited(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                getChildren().clear();
            }
        });
    }

    private Label createDataThresholdLabel(String string, Object object) {
        final Label label = new Label(object + "");
        label.getStyleClass().addAll("default-color0", "chart-line-symbol", "chart-series-line");
        label.setStyle("-fx-font-size: 20; -fx-font-weight: bold;");

        System.out.println(string);
        if (string.equals("engine1")) {
            label.setTextFill(Color.RED);
            label.setStyle("-fx-border-color: RED;");
        } else if (string.equals("engine2")) {
            label.setTextFill(Color.ORANGE);
            label.setStyle("-fx-border-color: ORANGE;");
        } else {
            label.setTextFill(Color.GREEN);
            label.setStyle("-fx-border-color: GREEN;");
        }

        label.setMinSize(Label.USE_PREF_SIZE, Label.USE_PREF_SIZE);
        return label;
    }
}

Output of this code is:

enter image description here

Keyur Bhanderi
  • 1,524
  • 1
  • 11
  • 17