我想延长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)
我缺少的是能够得到这个运行?
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。
由于在没有默认构造函数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
了。
因为我不能发表评论,我会用答案块。 我从来没有使用JavaFX的工作,但这个简单的Java问题。 有你的第二个方法定义的默认构造函数? 看起来像它的缺失。 类加载器需要默认的构造函数(不带参数)