java - InvokationTargetException 使用 javaFX 和 Maven 和 IntelliJ
问题描述
我是 javaFX 和 maven 的新手,我一直在尝试使用IntelliJ和maven以及 openjfx 依赖项配置一个新项目。我按照这里的说明进行操作:javaFX 和 IntelliJ -> 使用 maven 模块化,我选择了javafx-archetype-fxml而不是javafx-archetype-simple。使用 IDE 自动创建的示例代码一切正常。但是一旦我尝试将 aVBox
作为我的父级添加到根目录中,我就会遇到异常。这是代码:
package afa;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.io.IOException;
/**
* JavaFX App
*/
public class App extends Application {
private static Scene scene;
@Override
public void start(Stage stage) throws IOException {
//scene = new Scene(loadFXML("primary")); how auto-created code adds a Root to the scene
VBox container = new VBox();
scene.setRoot(container);
stage.setScene(scene);
stage.show();
}
static void setRoot(String fxml) throws IOException {
scene.setRoot(loadFXML(fxml));
}
private static Parent loadFXML(String fxml) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
return fxmlLoader.load();
}
public static void main(String[] args) {
launch();
}
}
这是我尝试运行代码时的异常:
Exception in Application start method
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.lang.NullPointerException
at afa/afa.App.start(App.java:24)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
... 1 more
Exception running application afa.App
这是我正在使用的 pom.xml 文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>afa</groupId>
<artifactId>space-invaders</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>14</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>14</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.1</version>
<configuration>
<mainClass>afa.App</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
最后是我正在使用的 module-info.java 文件:
module afa {
requires javafx.controls;
requires javafx.fxml;
opens afa to javafx.fxml;
exports afa;
}
有趣的是,如果我使用javafx-archetype-simple artifact id 创建项目,当前代码将毫无问题地运行,但我无法添加 .fxml 文件。而且我在 pom.xml 中都找不到任何区别(由javafx-archetype-simple创建的 pom.xml和由javafx-archetype-fxml创建的那个)。我遵循了这里提出的一些类似问题,但我无法弄清楚出了什么问题。我该怎么办?
解决方案
您的场景未根据代码初始化:
scene.setRoot(container);
所以你有 NullPointerException
推荐阅读
- android - 有没有办法在给定条件下初始化具有特定活动的应用程序?
- python - 为时间戳列创建 Bin
- vue.js - 如何影响插槽 vuejs 中的组件?
- python - 自定义 bash 函数不提供 python 多个参数
- java - 在 MariaDB 上使用 Hibernate 的 JPQL 更新查询出错
- python - 在列表中搜索终端输入并将匹配项存储到新列表中
- cuda - 使用 CUDA C/C++ 进行高斯图像模糊
- flutter - Flutter:如何在 Text 小部件中设置 maxLine
- django - Django ListView 分页设置
- bash - Maven 属性 - Windows 提示上的 Git Bash Shell 不是 UTF-8