Я пытаюсь создать диаграмму расстояния-времени, используя LineChart
в JavaFX, но у меня возникли трудности.Ось X проста, я хочу показать, что время делится на равные интервалы.
Ось Y более хитрая, так как мне нужны отметки на нерегулярных интервалах, которые представляют различные точки в пути, т.е.вместо того, чтобы ось делится между 0 - 100 милями, мне нужно разметить различные дискретные точки, например, 0 миль - это начало, 1,3 мили - следующая точка, 2,7 мили - следующая, 4,7 - следующая и т. д.
Это мой FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.chart.LineChart?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="576.0" prefWidth="952.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="timing.com.graphingapp.ui.GUIController">
<children>
<LineChart fx:id="lineGraph" layoutX="321.0" layoutY="35.0" prefHeight="533.0" prefWidth="548.0" title="Test Graph">
<xAxis>
<NumberAxis side="BOTTOM" fx:id="xAxis" />
</xAxis>
<yAxis>
<NumberAxis fx:id="yAxis" side="LEFT" />
</yAxis>
</LineChart>
</children>
</AnchorPane>
и это контроллер
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package timing.com.graphingapp.ui;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.chart.Axis.TickMark;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.TableRow;
/**
* FXML Controller class
*
* @author user
*/
public class GUIController implements Initializable {
@FXML
private LineChart<Double, Double> lineGraph;
@FXML
private NumberAxis yAxis;
private final XYChart.Series<Double, Double> series;
public GUIController() {
this.series = new XYChart.Series<>();
}
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
for(int i = 0; i < 9; i++) {
double position = Math.random() * 10;
XYChart.Data data = new XYChart.Data();
data.setXValue(i);
data.setYValue(position);
series.getData().add(data);
TickMark<Number> tm = new TickMark<>();
tm.setLabel("" + position);
tm.setPosition(position);
yAxis.getTickMarks().add(tm);
}
lineGraph.getData().add(series);
}
}
При этом получается следующее:
Caused by: java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at timing.com.graphingapp.ui.GUIController.initialize(GUIController.java:70)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
... 12 more
на этомстрока ...
yAxis.getTickMarks().add(tm);
Просмотр кода для Axis.getTickMarks()
показывает, что возвращается неизменяемый список объектов TickMark<T>
, который, кажется, является точкой слипания.
Можно ли как-нибудь выделить отметки в отдельных точках на оси y?