Как сделать пользовательский элемент управления LineChart в JavaFX? - PullRequest
0 голосов
/ 14 мая 2018

У меня был собственный элемент управления LineChartWithMarkers в моем проекте JavaFX.Я сделал двухлетнюю паузу в программировании на Java (FX) и обнаружил, что LineChartBuilder больше не существует в Java 10. Мне удалось найти некоторые документы, в которых говорится, что в версии 8 это устарело, но не как заменить их.

Как мне исправить мой код для работы с Java 10?

Вот что у меня было:

public class LineChartWithMarkersBuilder extends LineChartBuilder {
    private Axis<Number> xAxis ;
    private Axis<Number> yAxis ;        
    private ObservableList<Series<Number,Number>> data ;

    public static LineChartWithMarkersBuilder create() {
        return new LineChartWithMarkersBuilder();
    }

    public LineChartWithMarkersBuilder xAxis(Axis<Number> xAxis) {
        this.xAxis = xAxis ;
        return this ;
    }

    public LineChartWithMarkersBuilder yAxis(Axis<Number> yAxis) {
        this.yAxis = yAxis ;
        return this ;
    }


    public LineChartWithMarkers<Number, Number> build() {
        xAxis = new NumberAxis();
        yAxis = new NumberAxis();
        return new LineChartWithMarkers<Number, Number>( xAxis, yAxis);

    }
}

и пользовательские LineChartWithMarkers:

public class LineChartWithMarkers<X extends Number, Y extends Number> extends LineChart<X, Y>  {

    private ObservableList<Data<Number, Number>> verticalMarkers;


    public LineChartWithMarkers(Axis<X> xAxis, Axis<Y> yAxis) {
        super(xAxis, yAxis);
        this.setCreateSymbols(false);
        verticalMarkers = FXCollections.observableArrayList(data -> new Observable[] {data.XValueProperty()});
        verticalMarkers.addListener((InvalidationListener)observable -> layoutPlotChildren());
    }
    (...)
}

который я использовал из .fxml вот так:

...
                <LineChartWithMarkers fx:id="chartFit" createSymbols="false" layoutX="14.0" layoutY="54.0" prefHeight="499.0" prefWidth="987.0" AnchorPane.bottomAnchor="162.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="54.0">
                <xAxis>
                    <NumberAxis side="BOTTOM" />
                </xAxis>
                <yAxis>
                    <NumberAxis side="LEFT" />
                </yAxis>
            </LineChartWithMarkers>
...

1 Ответ

0 голосов
/ 14 мая 2018

Все классы JavaFX-сборщиков устарели в Java 8 и удалены в Java 9. Просто полностью удалите класс Builder.Чтобы разрешить FXMLLoader top создавать экземпляр класса без конструктора без аргументов, используйте аннотации @NamedArg для параметров конструктора:

public class LineChartWithMarkers<X extends Number, Y extends Number> extends LineChart<X, Y>  {

    private ObservableList<Data<Number, Number>> verticalMarkers;


    public LineChartWithMarkers(
            @NamedArg("xAxis") Axis<X> xAxis, 
            @NamedArg("yAxis") Axis<Y> yAxis) {
        super(xAxis, yAxis);
        this.setCreateSymbols(false);
        verticalMarkers = FXCollections.observableArrayList(data -> new Observable[] {data.XValueProperty()});
        verticalMarkers.addListener((InvalidationListener)observable -> layoutPlotChildren());
    }
    (...)
}

Полное обсуждение аннотации @NamedArg можно найти в Какова цель аннотации @NamedArg в javaFX 8?

...