【问题标题】:How to make custom LineChart control in JavaFX?如何在 JavaFX 中制作自定义 LineChart 控件?
【发布时间】:2018-10-24 03:56:10
【问题描述】:

我的 JavaFX 项目中有一个自定义 LineChartWithMarkers 控件。 我在 Java(FX) 编程中暂停了两年,发现 LineChartBuilder 在 Java 10 中不再存在。 我能够找到一些文档说它在版本 8 中已被弃用,但不知道如何替换它。

如何修复我的代码以使用 Java 10?

这就是我所拥有的:

public class LineChartWithMarkersBuilder extends LineChartBuilder {
    private Axis<Number> xAxis ;
    private Axis<Number> yAxis ;        
    private ObservableList<Series<Number,Number>> data ;

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

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

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


    public LineChartWithMarkers<Number, Number> build() {
        xAxis = new NumberAxis();
        yAxis = new NumberAxis();
        return new LineChartWithMarkers<Number, Number>( xAxis, yAxis);

    }
}

和自定义 LineChartWithMarkers:

public class LineChartWithMarkers<X extends Number, Y extends Number> extends LineChart<X, Y>  {

    private ObservableList<Data<Number, Number>> verticalMarkers;


    public LineChartWithMarkers(Axis<X> xAxis, Axis<Y> yAxis) {
        super(xAxis, yAxis);
        this.setCreateSymbols(false);
        verticalMarkers = FXCollections.observableArrayList(data -> new Observable[] {data.XValueProperty()});
        verticalMarkers.addListener((InvalidationListener)observable -> layoutPlotChildren());
    }
    (...)
}

我从 .fxml 中这样使用:

...
                <LineChartWithMarkers fx:id="chartFit" createSymbols="false" layoutX="14.0" layoutY="54.0" prefHeight="499.0" prefWidth="987.0" AnchorPane.bottomAnchor="162.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="54.0">
                <xAxis>
                    <NumberAxis side="BOTTOM" />
                </xAxis>
                <yAxis>
                    <NumberAxis side="LEFT" />
                </yAxis>
            </LineChartWithMarkers>
...

【问题讨论】:

  • 所有 JavaFX 构建器类在 Java 8 中已被弃用并在 Java 9 中被删除。只需完全删除构建器类并在构造函数参数上使用 @NamedArg 注释。
  • 谢谢!修复。请您 c/p 您对答案的评论,我会将其标记为正确答案。

标签: java javafx javafx-8


【解决方案1】:

所有 JavaFX 构建器类在 Java 8 中已被弃用,并在 Java 9 中被删除。只需完全删除构建器类。要允许 FXMLLoader 顶部实例化一个没有无参数构造函数的类,请在构造函数参数上使用 @NamedArg 注释:

public class LineChartWithMarkers<X extends Number, Y extends Number> extends LineChart<X, Y>  {

    private ObservableList<Data<Number, Number>> verticalMarkers;


    public LineChartWithMarkers(
            @NamedArg("xAxis") Axis<X> xAxis, 
            @NamedArg("yAxis") Axis<Y> yAxis) {
        super(xAxis, yAxis);
        this.setCreateSymbols(false);
        verticalMarkers = FXCollections.observableArrayList(data -> new Observable[] {data.XValueProperty()});
        verticalMarkers.addListener((InvalidationListener)observable -> layoutPlotChildren());
    }
    (...)
}

@NamedArg注解的完整讨论可以在What is the purpose of @NamedArg annotation in javaFX 8?中找到

【讨论】:

    猜你喜欢
    • 2013-08-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多