首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在fxml文件JAVA代码中使用控制器时出错

在fxml文件JAVA代码中使用控制器时出错
EN

Stack Overflow用户
提问于 2021-07-29 12:06:21
回答 2查看 78关注 0票数 1

为什么会发生这种错误?

以下是代码:

Main.java

代码语言:javascript
复制
public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("Screen.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}

Hhlee.java

代码语言:javascript
复制
public class Hhlee implements Initializable {
    @FXML private Button btn1, btn2, btn3;
    
    @Override
    public void initialize(URL location , ResourceBundle resources) {
        btn1.setOnAction(event -> handleBtn1Action(event));
        btn2.setOnAction(event -> handleBtn2Action(event));
        btn2.setOnAction(event -> handleBtn3Action(event));
    }
    
    public void handleBtn1Action(ActionEvent event) {
        System.out.println("버튼1 클릭");
    }
    
    public void handleBtn2Action(ActionEvent event) {
        System.out.println("버튼2 클릭");
    }
    
    public void handleBtn3Action(ActionEvent event) {
        System.out.println("버튼3 클릭");
    }
}

Screen.fxml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

<HBox xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1"
        prefWidth="300.0" hgap="10.0" vgap="10.0"
        fx:controller="application.Hhlee"
        prefHeight="50.0" prefWidth="200.0" alignment="CENTER" spacing="20.0">
    <Button fx:id="btn1" text="버튼1"/>
    <Button fx:id="btn2" text="버튼2"/>
    <Button fx:id="btn3" text="버튼3"/>
</HBox>

首先,我认为fx:controller="PackageName.ClassName"对Screen.fxml进行了多次检查,但所有这些都好。

其次,检查fxml路径:

以下抄写错误代码

代码语言:javascript
复制
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:78)
    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:78)
    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:1071)
        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:831)
    Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3230)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113)
    at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-29 16:47:39

我面临着一个类似的问题,就像@0009laH所说的,我把所有的文件Main.javaHhlee.javaScreen.fxml放在一个包里,那就是App/src/application。这样,您就不必每次都指定相对路径,只需直接使用以下命令:

代码语言:javascript
复制
public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
         FXMLLoader loader=new FXMLLoader(getClass().getResource("Screen.fxml"));
         Parent root=(Parent) loader.load();
         Scene scene = new Scene(root);
         primaryStage.setScene(scene);
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2021-07-29 12:53:44

通过getClass().getRessource(path)调用FXML文件时,必须从当前类的位置开始提供相对路径。

我建议你:

  1. Screen.fxml放入ui文件夹

FXMLLoader.load(Main.class.getResource("../ui/Screen.fxml"));.:

  1. 加载它
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68575610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档