Настройка подсказок на узле линейной диаграммы JavaFX - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь добавить всплывающие подсказки к различным узлам линейной диаграммы JavaFX. Моя диаграмма состоит из двух разных серий; каждая серия имеет несколько точек данных. Каждая точка данных относится к объекту. Мне нужно получить доступ к связанному объекту точки данных, чтобы добавить информацию в его всплывающую подсказку.

Из того, что я понимаю, всплывающие подсказки должны быть установлены после добавления данных в диаграмму. Я создал HashMap, который отслеживает добавленные точки данных относительно соответствующего объекта, чтобы я мог получить объект после добавления точек данных на диаграмму.

Ниже приведен пример добавления данных в серию:

dataToAdd = new XYChart.Data(Integer.toString(count), timeSpent);
addedData.put(dataToAdd, object); // Store a reference in a HashMap<XYChart.Data, DataObject>
series1.getData().add(new XYChart.Data(Integer.toString(count), timeSpent));

После запуска lineChart.getData().addAll(series1, series2); я перебираю серию графика и каждую серию, соответствующую XYChart.Data. Затем я пытаюсь сопоставить эти данные с данными в моем HashMap, чтобы я смог извлечь Question, который содержит данные, которые я хочу предоставить для всплывающей подсказки. Ниже приведен фрагмент кода, демонстрирующий это:

for (XYChart.Series<String, Number> s : lineChart.getData()) {
    for (XYChart.Data<String, Number> d : s.getData()) {
        // This if statement never evaluates to true
        if (addedData.containsKey(d)) {
            Tooltip tooltip = new Tooltip();
            tooltip.setText("Difficulty: " + addedData.get(d).difficulty.toString());
            Tooltip.install(d.getNode(), tooltip);
        }
    }
}

Я понятия не имею, почему я не могу сопоставить значение с моим Hashmap. Я пробовал все виды вещей, такие как сравнение с методом XY.Data.getNode(), но это также не дает никаких совпадений. Я подтвердил, что мой HashMap заполняется ссылками на объекты XY.Data. Что я здесь не так делаю?

Редактировать: Как указал Седрик, я добавлял new экземпляр объекта XYChart.Data, а не предоставлял ссылку на объект, который я добавлял в HashMap, не знаю, как я это пропустил!

1 Ответ

0 голосов
/ 16 сентября 2018

Глядя на ваш код, ваша проблема

listeningSeries.getData().add(new XYChart.Data(Integer.toString(listeningQuestionCount), timeSpent));

с вниманием на

new XYChart.Data(Integer.toString(listeningQuestionCount), timeSpent)

Этот код должен быть

listeningSeries.getData().add(dataToAdd);

В вашем первом случае у вас есть это. В остальном вы этого не сделаете. Я лично избавился бы от HashMap и использовал бы setExtraValue(), как в примере ниже.

Я не уверен, что нахожусь на правильном пути с вашим вопросом, но одну вещь, которую вы можете сделать, это использовать setExtraValue(), чтобы добавить связанные данные в узел. Таким образом, вам не придется полагаться на HashMap. Приведенный ниже код демонстрирует, как добавить дополнительные данные с помощью setExtraValue () `.

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<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);

        lineChart.setTitle("Stock Monitoring, 2010");
        //defining a series
        XYChart.Series<Number, Number> series = new XYChart.Series();
        series.setName("My portfolio");
        //populating the series with data
        Random rand = new Random();

        Map<Integer, Integer> 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();

        //When you create the data points for the series, go ahead and add any assoicated data to the data point.
        int counter = 1;
        Iterator i = set.iterator();
        while (i.hasNext()) {
            Map.Entry me = (Map.Entry) i.next();
            System.out.println(me.getKey() + " - " + me.getValue());
            XYChart.Data tempData = new XYChart.Data(me.getKey(), me.getValue());
            tempData.setExtraValue("I am data point " + counter++);
            series.getData().add(tempData);//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<Number, Number> entry : series.getData()) {
            System.out.println("Entered!");
            Tooltip t = new Tooltip(entry.getExtraValue().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);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...