Я пытаюсь следовать этому руководству:
https://docs.oracle.com/javafx/2/charts/scatter-chart.htm
Примеры руководства хорошо работают, но при попытке объединить это с построителем сцены и FXML я получаю некоторые странные ошибки. Прежде всего, по умолчанию ось X была осью категорий, и пришлось вручную изменить ее в XML. Теперь фрагмент выглядит так:
<ScatterChart fx:id="modScatChart" layoutX="303.0" layoutY="122.0" title="Modify timeline" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<xAxis>
<NumberAxis fx:id="scatXAxis" side="BOTTOM" />
</xAxis>
<yAxis>
<NumberAxis fx:id="scatYAxis" side="LEFT" />
</yAxis>
</ScatterChart>
Ось X должна быть NumberAxis, потому что значения X будут значениями даты с плавающей запятой, нормированными как 180-й день 2018 года, приблизительно. 2018,5. Теперь при попытке задать значения min, max, tick для NumberAxis кажется, что все игнорируется. Это выглядит всегда так:
введите описание изображения здесь
Вот соответствующий фрагмент кода (GraphBean в основном предоставляет HashMap (миллисекунды / loc, где ms будет преобразовано в дату), минимальное значение для оси x и максимальное значение для оси y.
public class FXMLDocumentController implements Initializable {
@FXML NumberAxis scatXAxis = new NumberAxis();
@FXML NumberAxis scatYAxis = new NumberAxis();
@FXML ScatterChart modScatChart = new ScatterChart(scatXAxis,scatYAxis);
@Override
public void initialize(URL url, ResourceBundle rb) {
try {
setupGraphs();
} catch(SQLException e){
System.out.println(e);
} catch(Exception e){
System.out.println(e);
}
}
private void setupGraphs() throws SQLException {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date(graphsBean.getMinModMs()));
int minYear = cal.get(Calendar.YEAR);
cal.setTime(new Date(System.currentTimeMillis()));
int thisYear = cal.get(Calendar.YEAR);
scatXAxis = new NumberAxis(minYear, thisYear, 1);
scatYAxis = new NumberAxis(0, graphsBean.getMaxLoc(), Math.round(graphsBean.getMaxLoc()/10));
scatXAxis.setLabel("Time");
scatYAxis.setLabel("Application size in loc");
Series series1 = new XYChart.Series();
series1.setName("All");
HashMap<Long, Integer> scatMap = graphsBean.getScatMap();
for (Map.Entry<Long, Integer> entry : scatMap.entrySet()) {
cal.setTime(new Date(entry.getKey()));
int curYear = cal.get(Calendar.YEAR);
float yearDayFlt = curYear+(float)(cal.get(Calendar.DAY_OF_YEAR))/365;
series1.getData().add(new XYChart.Data(yearDayFlt, entry.getValue()));
}
modScatChart.getData().addAll(series1);
}
}
Также пытались полностью инициализировать NumberAxis с ручными данными в начале класса, но результат все тот же. Какого черта я здесь скучаю?