将工具提示或标签添加到 JAVAFX 上的 xAxis CategoryData 图表
Adding Tooltip or Label to xAxis CategoryData Chart on JAVAFX
我从 here and I expect to Tooltip for each xAxis Data Category of BarChart (Country name) So that I can see Tooltip while Cursor at each Country name like 得到例子
这是代码
public class BarChartSample extends Application {
final static String austria = "Austria";
final static String brazil = "Brazil";
@Override public void start(Stage stage) {
stage.setTitle("Bar Chart Sample");
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis();
final BarChart<String,Number> bc = new BarChart(xAxis,yAxis);
bc.setTitle("Country Summary");
xAxis.setLabel("Country");
yAxis.setLabel("Value");
XYChart.Series series1 = new XYChart.Series();
series1.setName("2003");
series1.getData().add(new XYChart.Data(austria, 25601.34));
series1.getData().add(new XYChart.Data(brazil, 20148.82));
Scene scene = new Scene(bc,800,600);
bc.getData().addAll(series1);
//now you can get the nodes.
for (Series<String,Number> serie: bc.getData()){
for (XYChart.Data<String, Number> item: serie.getData()){
item.getNode().setOnMousePressed((MouseEvent event) -> {
System.out.println("you clicked "+item.toString()+serie.toString());
});
}
}
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我正在寻找你的来信。
从代码中..您可以为节点设置事件处理程序,您也可以为节点设置工具提示。
for (XYChart.Series<String, Number> series : bc.getData()) {
for (XYChart.Data<String, Number> item : series.getData()) {
item.getNode().setOnMousePressed((MouseEvent event) -> {
System.out.println("you clicked " + item.toString() + series.toString());
});
Tooltip.install(item.getNode(), new Tooltip(item.getXValue() + ":\n" + item.getYValue()));
}
}
更新::
根据您的要求,如果您想要轴标签上的工具提示,您可以尝试以下方法。我相信这不是正确的方法,但它可以给你一些结果。如果你有多个系列,我也不确定你想在工具提示中显示什么。
xAxis.getChildrenUnmodifiable().addListener((ListChangeListener<Node>) p -> {
if (p.next()) {
p.getAddedSubList().forEach(node -> {
if (node != null && node instanceof Text) {
final Text textNode = (Text) node;
final Optional<XYChart.Data<String, Number>> data = bc.getData().get(0).getData().stream().filter(item -> item.getXValue().equalsIgnoreCase(textNode.getText())).findFirst();
data.ifPresent(d -> {
Tooltip.install(textNode, new Tooltip(d.getXValue() + ":\n" + d.getYValue()));
});
}
});
}
});
我从 here and I expect to Tooltip for each xAxis Data Category of BarChart (Country name) So that I can see Tooltip while Cursor at each Country name like
public class BarChartSample extends Application {
final static String austria = "Austria";
final static String brazil = "Brazil";
@Override public void start(Stage stage) {
stage.setTitle("Bar Chart Sample");
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis();
final BarChart<String,Number> bc = new BarChart(xAxis,yAxis);
bc.setTitle("Country Summary");
xAxis.setLabel("Country");
yAxis.setLabel("Value");
XYChart.Series series1 = new XYChart.Series();
series1.setName("2003");
series1.getData().add(new XYChart.Data(austria, 25601.34));
series1.getData().add(new XYChart.Data(brazil, 20148.82));
Scene scene = new Scene(bc,800,600);
bc.getData().addAll(series1);
//now you can get the nodes.
for (Series<String,Number> serie: bc.getData()){
for (XYChart.Data<String, Number> item: serie.getData()){
item.getNode().setOnMousePressed((MouseEvent event) -> {
System.out.println("you clicked "+item.toString()+serie.toString());
});
}
}
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我正在寻找你的来信。
从代码中..您可以为节点设置事件处理程序,您也可以为节点设置工具提示。
for (XYChart.Series<String, Number> series : bc.getData()) {
for (XYChart.Data<String, Number> item : series.getData()) {
item.getNode().setOnMousePressed((MouseEvent event) -> {
System.out.println("you clicked " + item.toString() + series.toString());
});
Tooltip.install(item.getNode(), new Tooltip(item.getXValue() + ":\n" + item.getYValue()));
}
}
更新::
根据您的要求,如果您想要轴标签上的工具提示,您可以尝试以下方法。我相信这不是正确的方法,但它可以给你一些结果。如果你有多个系列,我也不确定你想在工具提示中显示什么。
xAxis.getChildrenUnmodifiable().addListener((ListChangeListener<Node>) p -> {
if (p.next()) {
p.getAddedSubList().forEach(node -> {
if (node != null && node instanceof Text) {
final Text textNode = (Text) node;
final Optional<XYChart.Data<String, Number>> data = bc.getData().get(0).getData().stream().filter(item -> item.getXValue().equalsIgnoreCase(textNode.getText())).findFirst();
data.ifPresent(d -> {
Tooltip.install(textNode, new Tooltip(d.getXValue() + ":\n" + d.getYValue()));
});
}
});
}
});