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