JavaFX LineChart Tick Marks - PullRequest
       28

JavaFX LineChart Tick Marks

0 голосов
/ 30 сентября 2018

Я пытаюсь создать диаграмму расстояния-времени, используя 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?

...