如何在JavaFX中扩展GridPane来覆盖add()会给NPE,Scene Builder打破

问题描述 投票:1回答:1

看起来像一个很少问的问题,所以也许扩展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;
    }
java javafx-8 fxml gridpane fxmlloader
1个回答
0
投票

最后,我在GridPane(或其中一个子类)上调用getHeight。当我终于清醒过来并真正想到它时,我在物体破碎之前检查了它。

如果之前未设置JavaFX对象的某些属性,则它们为null。使用getHeight()访问它们会导致(正确的)空指针异常。

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

© www.soinside.com 2019 - 2024. All rights reserved.