NoSuchMethodException 延伸javafx.scene.chart.Line

2019-10-20 09:12发布

我想延长javafx.scene.chart.LineChart ,以添加一些额外的功能。

我已经实现了两个构造

public LiveLineChart(Timeline animation, Axis<Number> xAxis, Axis<Number> yAxis)

public LiveLineChart(Timeline animation, Axis<Number> xAxis, Axis<Number> yAxis, ObservableList<Series<Number, Number>> data)

我的项目编译,但是,当我跑,我得到这样的:

Caused by: java.lang.NoSuchMethodException: org.mypackage.LiveLineChart.<init>()
at java.lang.Class.getConstructor0(Class.java:2971)
at java.lang.Class.newInstance(Class.java:403)
... 20 more

如果我试图实现一个默认的(空)构造函数,我得到一个编译错误:

no suitable constructor found for LineChart(no arguments)
constructor LineChart.LineChart(Axis<Number>,Axis<Number>) is not applicable
  (actual and formal argument lists differ in length)
constructor LineChart.LineChart(Axis<Number>,Axis<Number>,ObservableList<Series<Number,Number>>) is not applicable
  (actual and formal argument lists differ in length)

我缺少的是能够得到这个运行?

Answer 1:

LineChart没有默认的构造函数,所以你需要调用它从你定义构造函数显式声明的构造函数之一。 看着你说你声明的构造函数,你可能需要的东西是这样的:

public LiveLineChart(Timeline animation, Axis<Number> xAxis, Axis<Number> yAxis) {
    super(xAxis, yAxis);
    // ...
}

public LiveLineChart(Timeline animation, Axis<Number> xAxis, Axis<Number> yAxis, ObservableList<Series<Number, Number>> data) {
    super(xAxis, yAxis, data) ;
    // ...
}

如果您希望能够创建一个LiveLineChartFXML ,您可能需要一个无参数的构造函数,或生成器类。 一个无参数的构造函数不会离开你的任何机制来初始化轴(因为它们是由超类管理,是不可改变的,也就是说,没有办法对其进行设置,一旦超类构造函数被调用)。 所以,你最有可能需要定义如下:

public class LiveLineChartBuilder {
    private Axis<Number> xAxis ;
    private Axis<Number> yAxis ;
    private Timeline animation ;
    private ObservableList<Series<Number,Number>> data ;

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

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

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

    public LiveLineChartBuilder animation(Timeline animation) {
        this.animation = animation ;
        return this ;
    }

    public LiveLineChartBuilder data(Series<Number, Number> data) {
        this.data = data ;
        return this ;
    }

    public LiveLineChart build() {
        // if else may not be necessary, depending on how you define constructors in LiveLineChart
        if (data == null) {
            return new LiveLineChart(animation, xAxis, yAxis);
        } else {
            return new LiveLineChart(animation, xAxis, yAxis, data);
        }
    }
}

这将使你做

<LiveLineChart>
<xAxis><NumberAxis><!-- ... --></NumberAxis></xAxis>
<!-- etc -->
</LiveLineChart>

在FXML。



Answer 2:

由于在没有默认构造函数LineChart ,你需要调用基类的构造函数中的一个显式或使用构造函数链:

public LiveLineChart() {
    super(new ValueAxis<Number>(), new ValueAxis<Number>()); // use LineChart.LineChart(Axis<Number>,Axis<Number>)
    // do further initialisation
}

要么

public LiveLineChart() {
    this(new ValueAxis<Number>(), new ValueAxis<Number>()); // use LiveLineChart(Timeline animation, Axis<Number> xAxis, Axis<Number> yAxis)
    // do further initialisation
}

当然,你可以使用任何其他轴类型,而不是ValueAxis了。



Answer 3:

因为我不能发表评论,我会用答案块。 我从来没有使用JavaFX的工作,但这个简单的Java问题。 有你的第二个方法定义的默认构造函数? 看起来像它的缺失。 类加载器需要默认的构造函数(不带参数)



文章来源: NoSuchMethodException () when extending javafx.scene.chart.LineChart