Исключение при расширении JavaFX LineChart - PullRequest
0 голосов
/ 12 февраля 2020

Я хотел бы расширить JavaFX LineChart, чтобы добавить некоторые функции (предоставьте доступ к легенде, чтобы ее можно было настроить, добавив видимые границы и т. Д. c.). Я создал класс EnhancedLineChart, который объявил экземпляр в моем файле F XML, но он возвращает исключение:

Причина: com.sun.javafx.f xml .PropertyNotFoundException : Свойство "xAxis" не существует или доступно только для чтения.

Вот мой класс :

package com.ratp.oam.widgets.graph;

import com.sun.javafx.charts.Legend;

import javafx.collections.ObservableList;
import javafx.scene.chart.Axis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;

public class EnhancedLineChart extends LineChart<Number, Number> {
    public EnhancedLineChart() {
        super(new NumberAxis(), new NumberAxis());
    }

    public EnhancedLineChart(final NumberAxis xAxis, final NumberAxis yAxis) {
        super(xAxis, yAxis);
    }

    public EnhancedLineChart(final NumberAxis xAxis, final NumberAxis yAxis,
            ObservableList<Series<Number, Number>> data) {
        super(xAxis, yAxis, data);
    }

    @Override
    public Axis<Number> getXAxis() {
        return super.getXAxis();
    }

    @Override
    public Axis<Number> getYAxis() {
        return super.getYAxis();
    }

    /**
     * Fournit la légende du graphique telle qu'elle a été implémentée dans la
     * classe {@link LineChart}.
     * 
     * @return
     */
    public Legend legend() {
        return (Legend) super.getLegend();
    }
}

и F XML file где создается мой компонент (DataGraph.f xml):

<?xml version="1.0" encoding="UTF-8"?>

<?import com.ratp.oam.widgets.graph.EnhancedLineChart?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>

<fx:root type="javafx.scene.layout.HBox" xmlns:fx="http://javafx.com/fxml/1" spacing="3">
    <ScrollPane fitToWidth="true" HBox.hgrow="ALWAYS" styleClass="scroll-pane">
        <fx:define>
            <EnhancedLineChart fx:id="analogicalChart" createSymbols="false" animated="false" prefHeight="350">
                <padding>
                    <Insets topRightBottomLeft="0" />
                </padding>

                <xAxis>
                    <NumberAxis fx:id="analogicalXAxis" animated="false" side="BOTTOM" forceZeroInRange="false" autoRanging="false" />
                </xAxis>

                <yAxis>
                    <NumberAxis animated="false" side="LEFT" forceZeroInRange="false" autoRanging="false" />
                </yAxis>
            </EnhancedLineChart>
        </fx:define>

        <VBox fx:id="graphBox">
            <VBox fx:id="logicalPane" />
        </VBox>
    </ScrollPane>
</fx:root>

Как мне решить мою проблему?

Nota Bene

  • Я проверил импорт пакетов в моем файле F XML.
  • Я получаю тот же результат, когда удаляю 2 переопределенных метода.

1 Ответ

1 голос
/ 12 февраля 2020

Наконец я нашел решение, посмотрев на класс LineChart. Если я хочу использовать xAxis, yAxis и data в моем файле F XML, мне нужно поместить аннотацию @NamedArg перед аргументами конструктора, чтобы экземпляры могли вызываться загрузчиком F XML , Результат выглядит так:

package com.ratp.oam.widgets.graph;

import com.sun.javafx.charts.Legend;

import javafx.beans.NamedArg;
import javafx.collections.ObservableList;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;

public class EnhancedLineChart extends LineChart<Number, Number> {
    public EnhancedLineChart(@NamedArg("xAxis") NumberAxis xAxis, @NamedArg("yAxis") NumberAxis yAxis) {
        super(xAxis, yAxis);
    }

    public EnhancedLineChart(@NamedArg("xAxis") NumberAxis xAxis, @NamedArg("yAxis") NumberAxis yAxis, @NamedArg("data") ObservableList<Series<Number, Number>> data) {
        super(xAxis, yAxis, data);
    }

    /**
     * Fournit la légende du graphique telle qu'elle a été implémentée dans la
     * classe {@link LineChart}.
     */
    public Legend legend() {
        return (Legend) super.getLegend();
    }
}
...