似乎是一个很少有人问的问题,因此扩展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;
}
答案 0 :(得分:0)
最后,我在GridPane(或一个的子类)上调用了getHeight。当我终于清醒脑袋并真正考虑了一下之后,我就在物体破裂前检查了一下。
如果先前未设置JavaFX对象的某些属性,则这些属性为null。使用getHeight()访问它们会导致(正确的)Null Pointer Exception。
“高度”是其中之一,有一个“ _height”,但我还没有弄清楚如何访问它。