似乎是一个很少有人问的问题,所以扩展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”,但我还没有弄清楚如何访问它。

07-24 16:06