我正在尝试扩展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)
我错过了什么才能让它运行?
答案 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问题。 您是否在第二种方法中定义了默认构造函数?看起来像是失踪了。类加载器需要默认构造函数(没有参数)