簡體   English   中英

如何從命令行啟動 JavaFX 源代碼文件?

[英]How to launch JavaFX source code file from command line?

從 JDK 11 開始, java命令可以啟動 java 源代碼文件,即無需先編譯您的 java 源代碼。 這是我的 java 源代碼:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class HelloJavaFxWorld extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Label label = new Label("Hello JavaFX World");
        Pane root = new Pane(label);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

我將此代碼保存為文件HelloJavaFxWorld.java
我打開命令提示符 window 並輸入以下命令。

java HelloJavaFxWorld.java

這是(部分)output。

HelloJavaFxWorld.java:1: error: package javafx.application does not exist
import javafx.application.Application;

如何運行 JavaFX 源代碼文件?

由於 JDK 11 是模塊化的,因此您需要添加 JavaFX 模塊。 試試下面的。

java -p "path\to\javafx.graphics.jar;path\to\javafx.base.jar;path\to\javafx.controls.jar" --add-modules javafx.graphics,javafx.controls HelloJavaFxWorld.java

path\to替換為 JAR 文件的實際路徑。 例如,在我的 Windows 10 機器上,我已經安裝了 JDK 16.0.1,所以我使用 JavaFX 16 並將 [JavaFX] Z529E625C8C2BF37C6334AAE495A1D0F 文件放在以下文件夾中:

C:\Program Files\Java\javafx-sdk-16\lib

所以我啟動 JavaFX 源代碼文件的實際命令是:

java -p "C:\Program Files\Java\javafx-sdk-16\lib\javafx.graphics.jar;C:\Program Files\Java\javafx-sdk-16\lib\javafx.base.jar;C:\Program Files\Java\javafx-sdk-16\lib\javafx.controls.jar" --add-modules javafx.graphics,javafx.controls HelloJavaFxWorld.java

請注意,您可以使用--module-path代替-p 然后命令變為:

java --module-path "C:\Program Files\Java\javafx-sdk-16\lib" --add-modules javafx.graphics,javafx.controls HelloJavaFxWorld.java

請注意,我從包含 java 源代碼文件的文件夾中輸入該命令。

上述命令可能會導致以下異常。

Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: HelloJavaFxWorld
        at javafx.graphics/javafx.application.Application.launch(Application.java:310)
        at HelloJavaFxWorld.main(HelloJavaFxWorld.java:19)
Caused by: java.lang.ClassNotFoundException: HelloJavaFxWorld
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:466)
        at javafx.graphics/javafx.application.Application.launch(Application.java:298)
        at HelloJavaFxWorld.main(HelloJavaFxWorld.java:19)
        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 jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:415)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
        at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)

This is because, when launching a java source code file, the source code is compiled and the compiled class is stored in memory, ie no .class file is created. Method launch(String...) , in class javafx.application.Application , calls method forName , in class java.lang.Class in order to load the JavaFX application class. 由於沒有HelloJavaFxWorld.class文件,方法forName拋出ClassNotFoundException

為了解決這個問題,只需更改您的 java 源代碼以調用其他啟動方法。 換句話說,將方法main更改為以下內容。

public static void main(String[] args) {
    launch(HelloJavaFxWorld.class, args);
}

現在,當我輸入上面的java命令時,我得到以下 window。

JavaFX 應用程序窗口的屏幕截圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM