扩展javafx.scene.chart.LineChart </init>时出现NoSuchMethodException <init>()

时间:2014-06-27 14:58:40

标签: java javafx javafx-2

我正在尝试扩展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)

我错过了什么才能让它运行?

3 个答案:

答案 0 :(得分:1)

由于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

答案 1 :(得分: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) ;
    // ...
}

如果您希望能够从LiveLineChart创建FXML,则需要无参数构造函数或构建器类。无参构造函数不会给你任何初始化轴的机制(因为它们由你的超类管理并且是不可变的,即一旦调用了超类构造函数就没有办法设置它们)。所以你很可能需要定义以下内容:

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中。

答案 2 :(得分:0)

由于我无法发表评论,我将使用answer block。 我从未使用过javafx,但这是一个简单的java问题。 您是否在第二种方法中定义了默认构造函数?看起来像是失踪了。类加载器需要默认构造函数(没有参数)