当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX中扩展GridPane以覆盖add()正在给NPE,场景生成器中断

吕承福
2023-03-14

似乎是一个很少被问到的问题,所以也许扩展GridPane完全是错误的方法。我确实研究了如何扩展使用FXML和更多的自定义JavaFX组件。

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

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

JAVAlang.NullPointerException/javafx。fxml。加载异常:

这表明了我的观点。fxml:。。。(在边框窗格内)

<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(),认为这可能会有所不同,但它并没有,我相信仅仅通过使用扩展它就可以调用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个答案

公冶谦
2023-03-14

最后,我在GridPane(或其子类)上调用getHeight。当我终于清醒过来,真正思考它时,我在它断裂之前检查了它。

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

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

 类似资料:
  • 我运行wmii在linux和在想我自己,如果你可以运行javafx场景生成器从终端?

  • 我希望此图表显示在场景生成器上。怎么可能。。??

  • 是否有可能在这个答案中提供等效的内容,但在TypeScript中? 对 Java 生成器类进行子类化 这是迄今为止我对基类的了解: 和扩展类: 正如另一个线程提到的,由于上下文的变化,我将无法按此顺序构建客户: 我目前正在尝试使用泛型来解决此问题,但是在为我的 setter 方法返回 this 指针时遇到问题(类型 this 不能分配给类型 T)。有什么想法吗?

  • 所以,我需要在CMS中做一个扩展,称为TYPO3。这里有一些关于这个扩展的信息: “对于新的TYPO3 6.1网站,我们需要一个新闻稿扩展(基于ExtBase/Fluid),该扩展应包含: 标题/说明 目前实际上没有详细视图的设计,所以没有详细视图的链接。所以,现在,请专注于前端列表视图。" 我以前从未使用过这个CMS,所以我读了一下,发现我需要使用扩展生成器来创建这个扩展。所以,我已经下载并安装

  • 我对屏幕生成器有一些问题 对于某些fxml,它会在加载后发生creash。我尝试了很多次运行它,但它阻塞了,我必须终止这个进程。 fxml正常,内容在我的应用程序中正确显示。下面是导致场景生成器崩溃的FXML示例。

  • 如何将JavaFX中的线程与FXML以及任务或服务类一起使用? 我在我的程序中需要并发,因为我使用了一个很长的循环。如果我“手动”(没有FXML)编写这个代码,那么它就可以工作。但使用FXML它不起作用(JavaFX Scene Builder)。而不是在控制台中打印出“字符串缓冲区”变量,我想把它写在文本区域(这是一个可更新的组件)中。但在这种情况下,当然会出现错误消息,因为它不再属于JavaF