在StackPane内部加载网格窗格时发生JavaFX LoadException初始化

在StackPane内部加载网格窗格时发生JavaFX LoadException初始化,java,javafx,Java,Javafx,作为一个快速的解释,我只是想设置一个StackPane,它包含两个网格窗格,一个在另一个上面。从类名可以看出,我正在尝试制作一个策略游戏,我希望有一个GridPane作为背景环境,然后在上面有一个GridPane,用于存储玩家单位并捕获所有点击事件 我让StackPane加载没有问题,但是我尝试在StackPane的initialize函数中加载environment GridPane和unit GridPane,并且不断从中获得LoadException。我尝试了一些不同的路径,但没有改变任何

作为一个快速的解释,我只是想设置一个StackPane,它包含两个网格窗格,一个在另一个上面。从类名可以看出,我正在尝试制作一个策略游戏,我希望有一个GridPane作为背景环境,然后在上面有一个GridPane,用于存储玩家单位并捕获所有点击事件

我让StackPane加载没有问题,但是我尝试在StackPane的initialize函数中加载environment GridPane和unit GridPane,并且不断从中获得LoadException。我尝试了一些不同的路径,但没有改变任何事情

以下是我目前所在的位置:

Main.java

package application;

import java.io.IOException;

import javafx.application.Application; 
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class Main extends Application {
  @Override
  public void start(Stage primaryStage) {

    try {
        StackPane root = FXMLLoader.load(getClass().getResource("/application/battleGrid/BattleGrid.fxml"));
        primaryStage.setScene(new Scene(root, 700, 700));
        primaryStage.show();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

  }

  public static void main(String[] args) {
    launch(args);
  }
}
BattleGridController.java 包应用程序.battleGrid

import java.io.IOException;

import application.Main;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.LoadException;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;

public class BattleGridController {

@FXML
private StackPane stack;

  public void initialize() {
    try {
        GridPane environmentGrid = FXMLLoader.load(Main.class.getResource("/application/environmentGrid/EnvironmentGrid.fxml"));
        GridPane unitGrid = FXMLLoader.load(Main.class.getResource("/application/unitGrid/UnitGrid.fxml"));
        stack.getChildren().addAll(environmentGrid, unitGrid);
    } catch (LoadException e) {
        e.printStackTrace();
        System.out.println(e.getMessage());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
  }
}
BattleGrid.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.StackPane?>

<StackPane xmlns:fx="http://javafx.com/fxml/1"
        fx:controller="application.battleGrid.BattleGridController">
  <!-- TODO Add Nodes -->
</StackPane>
一般项目结构:

  • src
    • 应用
      • Main.java
      • 战场
        • BattleGridController.java
        • BattleGrid.fxml
      • 环境网格
        • EnvironmentGridController.java
        • EnvironmentGrid.fxml
      • 单位网格
        • UnitGridController.java
        • UnitGrid.fxml
编辑:

改变

FXMLLoader.load(Main.class.getResource("/application/unitGrid/unitGrid.fxml"));


同样的问题仍在发生

您的代码正在加载以下内容:

Main.class.getResource("/application/unitGrid/unitGrid.fxml")
但是,您声明它的名称有一个大写字母“U”

UnitGrid.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.GridPane?>

<GridPane xmlns:fx="http://javafx.com/fxml/1"
        fx:controller="application.unitGrid.UnitGridController">

</GridPane>

尝试更改为区分大小写加载。

堆栈跟踪指示未设置位置。这意味着FXMLLoader找不到资源路径。正如咕噜咕噜的鸽子所建议的那样,做出这些改变

更新

要加载资源,请使用CurrentThread

Thread.currentThread().getContextClassLoader().getResource("fxml_file_path")

谢谢你注意到那个错误。即使有变化,我也会犯同样的错误。假设getResource已经区分大小写是错误的吗?我知道问题在于资源路径,但找不到原因。我已经做了更改,但错误仍在发生。请添加项目结构,我们将明确如何加载资源?包结构添加发现问题,看起来我刚刚忘记在fxml文件中设置fx:id。因此,我试图调用的“堆栈”为空。问题已解决。在fxml文件中,从未设置fx:id。因此,在尝试调用BattleGridController中的“stack”时,引发了NullPointerException。
FXMLLoader.load(Main.class.getResource("/application/unitGrid/UnitGrid.fxml"));
Main.class.getResource("/application/unitGrid/unitGrid.fxml")
Thread.currentThread().getContextClassLoader().getResource("fxml_file_path")