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");

如果您注意到所有教程和示例都会预加载数据集。他们不得有涵盖最初为空的系列的测试用例。