如何在JavaFX中扩展GridPane以覆盖add(),给NPE、场景生成器带来了突破

如何在JavaFX中扩展GridPane以覆盖add(),给NPE、场景生成器带来了突破,java,javafx-8,fxml,gridpane,fxmlloader,Java,Javafx 8,Fxml,Gridpane,Fxmlloader,这似乎是一个很少被问到的问题,所以扩展GridPane可能是完全错误的方法。我确实看了很多 我正在尝试创建一个扩展GridPane的LawnGrid类,原因是重写add()方法以在添加ImageView节点时调整其大小。我还需要根据计算草坪的大小来调整大小,并计算出草坪是否比其高宽,以保持纵横比。我省略了一些似乎无关紧要的实施细节 问题是,当我将LawnGrid放入.fxml文件时,它不会显示在SceneBuilder(IntelliJ)中,我认为这是我做错了什么的症状。我得到这个错误: jav

这似乎是一个很少被问到的问题,所以扩展GridPane可能是完全错误的方法。我确实看了很多

我正在尝试创建一个扩展GridPane的LawnGrid类,原因是重写add()方法以在添加ImageView节点时调整其大小。我还需要根据计算草坪的大小来调整大小,并计算出草坪是否比其高宽,以保持纵横比。我省略了一些似乎无关紧要的实施细节

问题是,当我将LawnGrid放入.fxml文件时,它不会显示在SceneBuilder(IntelliJ)中,我认为这是我做错了什么的症状。我得到这个错误:

java.lang.NullPointerException/javafx.fxml.LoadException:

它指向my view.fxml: ... (在边框窗格内)

更新:根据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对象的某些属性,则这些属性为空。使用getHeight()访问它们会导致(正确的)空指针异常


“高度”是其中之一,有一个“_height”,但我还没有弄清楚如何访问它。

有两件事可能有助于改进您的问题(从而使回答更容易)。(1) 不要在问题的末尾添加代码更新,而是在原始代码中显示更新以避免混淆。如果您不再使用旧代码,我们就没有理由看到它。(2) 尝试创建并发布一个演示该问题的文档。包括NPE的堆栈跟踪。我们需要更多有关异常发生位置以及代码执行方式的信息。如果NPE发生在
LawnGrid
内部,请注意,您似乎只在第三个构造函数中初始化
preferredSquareSizeProperty
。您的FXML代码片段没有显示初始化属性的指示(它可能会使用no-arg构造函数),因此可能是
null
。另外,给类提供一个
DoubleProperty
的实例似乎是错误的。为什么不将它作为类的属性,并简单地设置它或将它绑定到其他属性?这与您的实际问题并不完全相关。。如果重写add()方法的唯一目的是调整ImageView的大小,我假设您可以通过向gridPane.getChildren()添加一个侦听器来实现。只是一个想法,不知道你的其他要求:)@Slaw再次感谢我在取消删除后对这个问题进行了大量编辑,你可以看到下面的答案,这是显而易见的,同时也是模糊的——至少对我来说是这样。希望这对其他人有所帮助。你并不是真的想改变你发布的实际问题。如果你想记录它,你应该把所有相关的信息/事实放在你的答案中。既然你现在很活跃,我会给你一个这样做的机会,但我知道我会在几个小时后回退这个问题。
// lawn representation for lawn display in GUI
    @FXML
    private LawnGrid lawnGridPane = new LawnGrid();
   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;
    }