簡體   English   中英

在StackPane內部加載GridPanes時初始化JavaFX LoadException

[英]JavaFX LoadException when loading GridPanes inside of a StackPane initialize

簡要說明一下,我正在嘗試設置一個StackPane,其中包含兩個GridPanes,一個彼此疊加。 從類名可以看出,我正在嘗試制作策略游戲,並且我想擁有一個GridPane作為背景環境,然后在其上方放置一個GridPane來存儲玩家單位,並且捕獲所有點擊事件。

我已經讓StackPane加載了沒有問題,但是然后我嘗試同時在StackPane的initialize函數中加載環境GridPane和單元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包application.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>

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>

EnvironmentGrid.fxml

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

<GridPane xmlns:fx="http://javafx.com/fxml/1"
        fx:controller="application.environmentGrid.EnvironmentGridController"
        gridLinesVisible="true">

</GridPane>

當前,環境和單位網格的控制器中沒有任何內容,因此那里應該沒有問題。

這是堆棧跟蹤:

javafx.fxml.LoadException: 
/Users/markbluemer/Documents/workspace2/GridPanePractice/bin/application/battleGrid/BattleGrid.fxml

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2571)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at application.Main.start(Main.java:17)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)

Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2566)
... 14 more

Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at application.battleGrid.BattleGridController.initialize(BattleGridController.java:19)
... 25 more

總體項目結構:

  • src
    • 應用
      • Main.java
      • BattleGrid
        • BattleGridController.java
        • BattleGrid.fxml
      • 環境網格
        • EnvironmentGridController.java
        • EnvironmentGrid.fxml
      • unitGrid
        • UnitGridController.java
        • UnitGrid.fxml

編輯:

已變更

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

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

仍然出現相同的問題

您的代碼正在加載此代碼:

Main.class.getResource("/application/unitGrid/unitGrid.fxml")

但是,您要說明它的名稱具有大寫字母“ U”

UnitGrid.fxml

嘗試更改為區分大小寫的加載。

堆棧跟蹤指示未設置位置。 這意味着FXMLLoader找不到資源路徑。 正如發出怒吼的鴿子所建議的那樣,進行那些更改。

更新

要加載資源,請使用CurrentThread,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM