我是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()
,它将正常工作。
我希望画布在应用程序启动时自动绘制。我该怎么办?我在做错什么吗?
答案 0 :(得分:0)
调用Canvas子类的构造函数时,该对象不属于Scene,并且尚未通过布局传递。也许draw()方法中未显示的部分取决于尚未设置的Canvas的尺寸?
请参见How to make canvas Resizable in javaFX?
通过调用draw方法的侦听器来响应宽度或高度的变化。