如何为Maven项目的resources文件夹中的fxml文件设置控制器?

问题描述

我正在尝试开发我的第一个javafx桌面应用程序,但是我陷入了僵局。 首先,程序将读取一些具有销售量的excel文件,然后创建一个数据库并汇总3名员工的总收入。但是当我为第一个场景创建fxml文件时,无论我做什么,编译器都没有找到fxml文件。 经过一番研究,我发现如果将fxml放在resouces文件夹中可以正常工作,但更糟糕的是,现在我做了fxml文件无法使用fx:controller选项识别Controller的情况,可能是因为它不是。 t在同一目录中了。我搜索了更多内容,找到了如何解决它的线索,但完全理解如何去做。在这个问题JavaFX and maven: NullPointerException: Location is required中,它说可以使用maven资源插件代码创建fxml文件的副本:

<build>
...
<resources>
    <resource>
        <filtering>false</filtering>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.fxml</include>
        </includes>             
    </resource>
</resources>
...

但是我该怎么做? fxml文件必须在哪里为主目录文件夹或资源文件夹?如果我使用其中一个的场景构建器更改了数据,那么另一个也会更改吗?我需要在porn.xml中添加此Maven资源插件吗?以下是一些照片:

Main - Project

balanceus.fxml in the resource folder before trying fx:controller

running fine put without controller

then after add fx:controller

it breaks

这是git hub的链接,其中包含文件和尝试运行时得到的完整错误的.txt:

github

感谢您的帮助,也对英语不好(不是我的母语)表示歉意。

解决方法

我下载并分析了您的项目,发现结构中存在一些错误(并且module.info中缺少“ open语句”),但是在修复它们后仍然不起作用。 :-(

因此,我从原型中创建了一个新项目,如下所示: Getting Started with JavaFX > JavaFX and IntelliJ > Modular with Maven

使用„ javafx-archetype-fxml“ 时,您将获得项目所需的基本结构。然后,我将项目的某些文件复制到正确的位置,如下所示:

project structure

因此您可以看到fxml文件不必位于主ressource文件夹中。我将它们放在一个单独的名为fxml的文件夹中。

然后我复制了您的 App 类,并将其更改为:

package com.ultrasomma;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;

import java.io.IOException;


public class App extends Application {

    @Override
    public void start(Stage stage) throws IOException {
        Scene scene = new Scene(FXMLLoader.load(App.class.getResource("fxml/balanceus.fxml")));
        scene.getStylesheets().add(App.class.getResource("css/BalanceUS.css").toExternalForm());
        stage.setTitle("BalanceUS");
        stage.getIcons().add(new Image(App.class.getResource("img/BalanceUS.png").toExternalForm()));
        stage.setResizable(false);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

}

模块信息如下所示(您必须添加从中提取的其他内容):

module com.ultrasomma {
    requires javafx.controls;
    requires javafx.fxml;

    // This statement is missing in your project:
    opens com.ultrasomma to javafx.fxml;

    exports com.ultrasomma;
}

如果您这样做,它也应该对您有用(无需操纵pom文件)。


我不确定我是否正确理解了您的问题:

如果我使用其中一个的场景构建器更改了数据,那么另一个也更改了吗?

如果您更改“ balanceus.fxml”,那么“ balanceus2.fxml”将不会更改。


fxml中控制器的引用很好。

fx:controller="com.ultrasomma.Controller"