JavaFX自定义画布节点?

时间:2019-08-30 12:51:15

标签: java javafx javafx-8 javafx-2 fxml

我是JavaFx的新手。我想使用Canvas创建一个自定义进度栏,并将其直接添加到我的fxml文件中(而不是使用Java代码)。

这是我的自定义画布类:

public class CircularProgressBar extends Canvas {

    public CircularProgressBar() {
        super();
        draw(); // this call here doesn't work
    }

    public void draw() {
        GraphicsContext gc = this.getGraphicsContext2D();

        gc.setLineWidth(1.0);
        gc.setStroke(Color.GREEN);
        gc.setFill(Color.RED);

        // draw progress bar
    }
}

还有fxml文件:

<?imports...?>

<GridPane fx:controller="com.mypackage.MainController">

    <CircularProgressBar fx:id="progressBar"
                         width="500"
                         height="500"
                         GridPane.columnSpan="2"
                         GridPane.rowIndex="0"/>
</GridPane>

应用程序启动时,将调用CircularProgressBar()构造函数(因此也将调用draw()方法),但是画布上没有任何显示。但是,如果我在应用程序类中手动调用progressBar.draw(),它将正常工作。

我希望画布在应用程序启动时自动绘制。我该怎么办?我在做错什么吗?

1 个答案:

答案 0 :(得分:0)

调用Canvas子类的构造函数时,该对象不属于Scene,并且尚未通过布局传递。也许draw()方法中未显示的部分取决于尚未设置的Canvas的尺寸?

请参见How to make canvas Resizable in javaFX?

通过调用draw方法的侦听器来响应宽度或高度的变化。