看起来像一个很少问的问题,所以也许扩展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”。我假设我遗漏了一些关于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”,但我还没弄明白如何访问它。