问题描述
我正在尝试开发我的第一个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资源插件吗?以下是一些照片:
balanceus.fxml in the resource folder before trying fx:controller
running fine put without controller
这是git hub的链接,其中包含文件和尝试运行时得到的完整错误的.txt:
感谢您的帮助,也对英语不好(不是我的母语)表示歉意。
解决方法
我下载并分析了您的项目,发现结构中存在一些错误(并且module.info中缺少“ open语句”),但是在修复它们后仍然不起作用。 :-(
因此,我从原型中创建了一个新项目,如下所示: Getting Started with JavaFX > JavaFX and IntelliJ > Modular with Maven
使用„ javafx-archetype-fxml“ 时,您将获得项目所需的基本结构。然后,我将项目的某些文件复制到正确的位置,如下所示:
因此您可以看到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"