如何在JavaFX中扩展GridPane以覆盖add()给NPE,Scene Builder中断

时间:2019-03-31 20:15:26

标签: java javafx-8 fxml gridpane fxmlloader

似乎是一个很少有人问的问题,因此扩展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;
    }

1 个答案:

答案 0 :(得分:0)

最后,我在GridPane(或一个的子类)上调用了getHeight。当我终于清醒脑袋并真正考虑了一下之后,我就在物体破裂前检查了一下。

如果先前未设置JavaFX对象的某些属性,则这些属性为null。使用getHeight()访问它们会导致(正确的)Null Pointer Exception。

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