JavaFX 散点图在使用空数据集初始化时不显示图例符号
JavaFX ScatterChart Does not display legend symbol when initialized with empty dataset
我有一个要用空数据集初始化的散点图;但是,当我初始化所有内容时,图例符号将永远不会出现。我使用 Oracle 的 ScatterChart 示例模拟了这个问题:
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.ScatterChart;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
public class ScatterChartSample extends Application {
@Override public void start(Stage stage) {
stage.setTitle("Scatter Chart Sample");
final NumberAxis xAxis = new NumberAxis(0, 10, 1);
final NumberAxis yAxis = new NumberAxis(-100, 500, 100);
final ScatterChart<Number,Number> sc = new
ScatterChart<>(xAxis,yAxis);
xAxis.setLabel("Age (years)");
yAxis.setLabel("Returns to date");
sc.setTitle("Investment Overview");
ObservableList<XYChart.Data> data =
FXCollections.observableArrayList();
XYChart.Series series1 = new XYChart.Series();
series1.setName("Equities");
series1.setData(data);
XYChart.Series series2 = new XYChart.Series();
series2.setName("Mutual funds");
series2.getData().add(new XYChart.Data(5.2, 229.2));
series2.getData().add(new XYChart.Data(2.4, 37.6));
series2.getData().add(new XYChart.Data(3.2, 49.8));
series2.getData().add(new XYChart.Data(1.8, 134));
series2.getData().add(new XYChart.Data(3.2, 236.2));
series2.getData().add(new XYChart.Data(7.4, 114.1));
series2.getData().add(new XYChart.Data(3.5, 323));
series2.getData().add(new XYChart.Data(9.3, 29.9));
series2.getData().add(new XYChart.Data(8.1, 287.4));
sc.getData().addAll(series1, series2);
Scene scene = new Scene(sc, 500, 400);
stage.setScene(scene);
stage.show();
XYChart.Series series3 = new XYChart.Series();
series3.setName("Equities");
series1.getData().add(new XYChart.Data(4.2, 193.2));
}
public static void main(String[] args) {
launch(args);
}
}
我会 post 我得到的结果的图片,但我没有足够的代表。
问题是因为你的数据集是空的。
查看 ScatterChart.java
(JAVA 1.8u66) 中的代码,如果 !series.getData().isEmpty()
.
/**
* This is called whenever a series is added or removed and the legend needs to be updated
*/
@Override protected void updateLegend() {
legend.getItems().clear();
if (getData() != null) {
for (int seriesIndex=0; seriesIndex< getData().size(); seriesIndex++) {
Series<X,Y> series = getData().get(seriesIndex);
LegendItem legenditem = new LegendItem(series.getName());
if (!series.getData().isEmpty() && series.getData().get(0).getNode() != null) {
legenditem.getSymbol().getStyleClass().addAll(series.getData().get(0).getNode().getStyleClass());
}
legend.getItems().add(legenditem);
}
}
if (legend.getItems().size() > 0) {
if (getLegend() == null) {
setLegend(legend);
}
} else {
setLegend(null);
}
}
他们需要一个非空系列来复制,因为样式是数据点的属性,而不是您期望的整个系列。
无论如何,解决方法很容易。只需在设置图例 属性 之前添加一个数据点,代码就会按照您的意愿被调用。例如,我这样做:
rollSeries.getData().add(new XYChart.Data<>(0,0));
rollSeries.setName("Roll");
如果您注意到所有教程和示例都会预加载数据集。他们不得有涵盖最初为空的系列的测试用例。
我有一个要用空数据集初始化的散点图;但是,当我初始化所有内容时,图例符号将永远不会出现。我使用 Oracle 的 ScatterChart 示例模拟了这个问题:
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.ScatterChart;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
public class ScatterChartSample extends Application {
@Override public void start(Stage stage) {
stage.setTitle("Scatter Chart Sample");
final NumberAxis xAxis = new NumberAxis(0, 10, 1);
final NumberAxis yAxis = new NumberAxis(-100, 500, 100);
final ScatterChart<Number,Number> sc = new
ScatterChart<>(xAxis,yAxis);
xAxis.setLabel("Age (years)");
yAxis.setLabel("Returns to date");
sc.setTitle("Investment Overview");
ObservableList<XYChart.Data> data =
FXCollections.observableArrayList();
XYChart.Series series1 = new XYChart.Series();
series1.setName("Equities");
series1.setData(data);
XYChart.Series series2 = new XYChart.Series();
series2.setName("Mutual funds");
series2.getData().add(new XYChart.Data(5.2, 229.2));
series2.getData().add(new XYChart.Data(2.4, 37.6));
series2.getData().add(new XYChart.Data(3.2, 49.8));
series2.getData().add(new XYChart.Data(1.8, 134));
series2.getData().add(new XYChart.Data(3.2, 236.2));
series2.getData().add(new XYChart.Data(7.4, 114.1));
series2.getData().add(new XYChart.Data(3.5, 323));
series2.getData().add(new XYChart.Data(9.3, 29.9));
series2.getData().add(new XYChart.Data(8.1, 287.4));
sc.getData().addAll(series1, series2);
Scene scene = new Scene(sc, 500, 400);
stage.setScene(scene);
stage.show();
XYChart.Series series3 = new XYChart.Series();
series3.setName("Equities");
series1.getData().add(new XYChart.Data(4.2, 193.2));
}
public static void main(String[] args) {
launch(args);
}
}
我会 post 我得到的结果的图片,但我没有足够的代表。
问题是因为你的数据集是空的。
查看 ScatterChart.java
(JAVA 1.8u66) 中的代码,如果 !series.getData().isEmpty()
.
/**
* This is called whenever a series is added or removed and the legend needs to be updated
*/
@Override protected void updateLegend() {
legend.getItems().clear();
if (getData() != null) {
for (int seriesIndex=0; seriesIndex< getData().size(); seriesIndex++) {
Series<X,Y> series = getData().get(seriesIndex);
LegendItem legenditem = new LegendItem(series.getName());
if (!series.getData().isEmpty() && series.getData().get(0).getNode() != null) {
legenditem.getSymbol().getStyleClass().addAll(series.getData().get(0).getNode().getStyleClass());
}
legend.getItems().add(legenditem);
}
}
if (legend.getItems().size() > 0) {
if (getLegend() == null) {
setLegend(legend);
}
} else {
setLegend(null);
}
}
他们需要一个非空系列来复制,因为样式是数据点的属性,而不是您期望的整个系列。
无论如何,解决方法很容易。只需在设置图例 属性 之前添加一个数据点,代码就会按照您的意愿被调用。例如,我这样做:
rollSeries.getData().add(new XYChart.Data<>(0,0));
rollSeries.setName("Roll");
如果您注意到所有教程和示例都会预加载数据集。他们不得有涵盖最初为空的系列的测试用例。