似乎是一个很少有人问的问题,所以扩展GridPane可能是完全错误的方法。我确实看过How to extend custom JavaFX components that use FXML等等。
我正在尝试创建扩展GridPane的LawnGrid类,原因是要覆盖add()方法以在添加ImageView节点时调整其大小。我还需要基于计算LawnGrid的大小并确定草坪是否宽于高的大小来调整大小,以保持宽高比。我遗漏了似乎无关的实现细节。
问题是,当我将LawnGrid放入.fxml文件时,它不会在SceneBuilder(在IntelliJ中)中显示,我认为这是我做错了的症状。我收到此错误:
java.lang.NullPointerException / javafx.fxml.LoadException:
指向我的view.fxml:
...
(在BorderPane内部)
<center>
<LawnGrid fx:id="lawnGridPane" style=" -fx-border-color:green; -fx-border-width: 10; -fx-border-style: solid;" BorderPane.alignment="CENTER">
</LawnGrid>
</center>
我想以编程方式添加约束,也许我需要预先添加约束,但似乎会遇到其他错误。基于以上链接的答案,我的LawnGrid.java以以下内容开头:
@DefaultProperty(value = "lawnGrid")
public class LawnGrid extends GridPane {
更新:根据Slaw的反馈,我看到在错误的位置放置FXML注释的错误,将其移至我的FXController.java:
// lawn representation for lawn display in GUI
@FXML
private LawnGrid lawnGridPane = new LawnGrid();
FWIW当我尝试运行NPE时,我也得到了NPE,该应用程序出现了,但是在我在LawnGrid中引用“ this”的行上给出了NPE。我假设我缺少有关JavaFX如何实例化对象的基本知识,并且需要在某个地方创建LawnGrid,但是我认为.fxml文件对此进行了设置。
编辑:我确实将super()添加到我的构造函数中,以为可能会有所不同,但事实并非如此,我相信只是通过使用
extends
它会调用super()?这是LawnGrid.java中的构造函数: public LawnGrid(){
super();
// uses default max 10 rows 15 columns
setupLawnConstraints();
}
public LawnGrid(double rows, double columns){
super();
this.numRows = rows;
this.numCols = columns;
setupLawnConstraints();
}
public LawnGrid(double rows, double columns, DoubleProperty preferredSquareSizeProperty) {
super();
this.numRows = rows;
this.numCols = columns;
this.preferredSquareSizeProperty = preferredSquareSizeProperty;
}
最佳答案
最后,我在GridPane(或一个的子类)上调用了getHeight。当我终于清了清脑袋并真正思考了一下之后,我在物体破裂前检查了一下。
如果JavaFX对象的某些属性先前未设置,则为null。使用getHeight()访问它们会导致(正确)空指针异常。
“高度”是其中之一,其中有一个“ _height”,但我还没有弄清楚如何访问它。