在 JavaFX 折线图节点上设置工具提示
Setting tooltips on JavaFX line chart node
我正在尝试向 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 对象的引用。我在这里做错了什么?
编辑:正如 Sedrick 指出的那样,我正在添加一个 XYChart.Data 对象的 new
实例,而不是提供对我添加到 HashMap 的对象的引用,不知道我怎么错过了这个!
看你的代码,你的问题是
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);
}
}
我正在尝试向 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 对象的引用。我在这里做错了什么?
编辑:正如 Sedrick 指出的那样,我正在添加一个 XYChart.Data 对象的 new
实例,而不是提供对我添加到 HashMap 的对象的引用,不知道我怎么错过了这个!
看你的代码,你的问题是
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);
}
}