0

我需要帮助解决在使用 jpackage 打包程序时遇到的问题。该程序是在 Eclipse 中创建的非模块化 JavaFX 应用程序。在 Eclipse 中,应用程序可以准确地编译和运行。但是当我使用命令提示符进行编译和运行时,编译工作但应用程序不再运行。我收到以下错误消息:

java.lang.NullPointerException:无法调用“java.net.URL.toExternalForm()”,因为“java.lang.Class.getResource(String)”的返回值为 null 在 application.Main.start(Main.java:158 ) 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) 在 javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) 在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) at java.base/java.lang.Thread.run(Thread.爪哇:832)

尽管如此,jpackage 创建了一个安装程序,没有任何错误或警告消息。使用创建的安装程序进行安装也可以正常工作。但是当我启动我的应用程序时,我的 GUI 将不会显示。更准确地说:GUI 的第一部分是一些设置窗口,它们使用标准布局。显示设置窗口,但不显示“主”GUI。因此,我认为问题的根源在于缺少的 css 文件。我的假设是否正确,如果是的话:我该如何解决?

提前致谢!

附录:这是我的命令提示符输入:

  1. 目录 /s /b *.java > 来源.txt

  2. javac --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml –d out @sources.txt

  3. java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml --cp out application.Main (这里出现错误)

  4. jar --create --file=libs/sample1.jar --main-class=application.Main –C out 。

  5. %JAVA_HOME%\bin\jpackage --type exe –i libs --main-jar sample1.jar –n Sample1 --module-path %PATH_TO_FX_MODS% --add-modules javafx.controls,javafx.fxml --main-class application.Main --win-shortcut --win-menu --win-dir-chooser

css 文件与主类位于同一目录中。

4

1 回答 1

0

谢谢你的提示。我仔细阅读了链接给出的手册。现在我明白我的代码可能存在问题。之前我认为 jpackage 和命令提示符中的命令存在问题。与此同时,我重新编写了代码并用 URL 类替换了文件类。但我仍然遇到类似的错误。因此,我编写了一个新的(简单)代码来重现该错误。

package application;
    
import java.io.BufferedReader;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,600,500);
            URL urlImage = getClass().getResource("image.jpg");
            Image image = new Image(urlImage.toExternalForm(), 600, 400, true, true);
            ImageView imageView = new ImageView(image);
            root.setCenter(imageView);
            
            Label headline = new Label("Example Image");
            URL urlStyles = getClass().getResource("styles.css");
            headline.getStylesheets().add(urlStyles.toExternalForm());      
            root.setTop(headline);
            
            Button button = new Button();
            URL urlFile = getClass().getResource("text.txt");
            String temp = urlFile.toString().replaceFirst("file:/", "");
            button.setText(read(temp));
            root.setBottom(button);         
            
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        launch(args);
    }
    
    public String read (String file) throws IOException {
        FileReader fileReader = new FileReader(file);
        BufferedReader in = new BufferedReader(fileReader);
        try {           
            String str = in.readLine();
            in.close();
            return str;
        } catch(IOException e) {
            e.printStackTrace();
            return "Error";
        }
    }
}

在使用命令提示符编译时,我仍然收到错误:

java.lang.NullPointerException:无法调用“java.net.URL.toExternalForm()”,因为“”在 javafx.graphics/com.sun.javafx.application 的 application.Main.start(Main.java:25) 处为空。 LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846) 在 javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455) 在 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) 在 javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) 在 javafx.graphics/com.sun.glass.ui.win。 javafx.graphics/com 上的 WinApplication._runLoop(本机方法)。sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174) 在 java.base/java.lang.Thread.run(Thread.java:832)

如果我尝试加载图像(我的代码中的第一段)、css(第二段)或 txt 文件(最后一段)并不重要。所有这些文件(图像、css、txt)都与主类位于同一目录中。

也许我错过了树林中的森林,但我认为我使用了 URL 类,就像指南解释的那样。我在下面寻求任何进一步的建议。谢谢!

于 2021-05-06T09:13:33.413 回答