3

我正在尝试使用 Windows 10 下的 jGRASP 2 在 JavaFX 11 和 Java 11 下运行示例 JavaFX 代码(取自 Java Illuminated 的第 5 版)。

我已经广泛阅读了“JavaFX 入门”指南 ( https://openjfx.io/openjfx-docs/ ),虽然我取得了一些进展,但我还是被卡住了。

我已经下载了最新的 ZIP 文件,将其解压缩,并更新了 CLASSPATH 以包含编译所需的 jar 文件的路径。我可以成功编译该文件。但是,当我尝试运行时,我收到以下错误消息:

错误:缺少 JavaFX 运行时组件,需要运行此应用程序

“入门”指南说,可以通过在运行时调用中添加以下选项来解决此问题:

--module-path "[path]\lib" --add-modules=javafx.controls,javafx.fxml

我已经添加了选项,但我仍然收到错误消息。

以前的 StackOverflow 文章通常以上面的选项设置结束;唉,我不知道还能做什么。

4

2 回答 2

3

作为第一次使用的用户,我设法让它工作,但这对我来说并不简单。

我想没有多少人熟悉这个IDE,所以我将发布我遵循的步骤,作为一个基本教程:

  • 下载并安装 jGRASP 版本 2.0.5_05 Beta。

  • 由于我安装了一些 JDK,它默认选择 JDK 10.0.2,所以我的第一步是找到一种使用 JDK 11 的方法。这可以在 中完成Settings -> jGrasp Startup Settings,我可以在其中设置java可执行文件的路径:

设置JDK 11

然后我重新启动了jGrasp。您可以验证 IDE 使用的是哪个 JDK Tools -> System Info -> Java Version

  • 打开 HelloFX 示例类。我从OpenJFX 文档中最基本的示例开始。代码可以在这里找到。

  • Build -> compile,正如预期的那样,鉴于 JavaFX 不再是 JDK 的一部分,将会引发一堆错误:

编译失败

  • 按照 OpenJFX 文档,我们需要从这里下载 JavaFX SDK ,然后将库添加到类路径中。转到Settings -> PATH/CLASSPATH -> Workspace,按新建,然后从下载的 SDK/lib 文件夹(至少javafx-base.jarjavafx-graphics.jarjavafx-controls.jar)中一一添加不同的 JavaFX jar。

  • Build -> compile现在应该可以工作了。

  • 下一步:Build -> Run. 这失败了:

----jGRASP exec: java HelloFX
Error: JavaFX runtime components are missing, and are required to run this application

 ----jGRASP wedge: exit code for process is 1.
 ----jGRASP: operation complete.

这是意料之中的。根据文档,我们需要设置 module-path 和 add-modules 参数。

  • 第一次尝试:使用Run arguments. 设置后:
--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls

再次运行失败并显示与上述完全相同的错误消息,但控制台日志中有一个不同之处:

----jGRASP exec: java HelloFX --module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls

这有什么问题!?嗯......如果你在命令行上尝试,它也会失败,因为参数的顺序是错误的,vm参数应该放在类名之前。

结论:Run arguments不是VM arguments

  • 第二次尝试:为了提供 VM 参数,我发现的选项是编辑Settings -> Compiler settings -> Workspace. 默认情况下,它使用jdk (integrated debugger) - generic. 您可以查看它并查看Run它的用途:
java %S -ea %S %<FLAGS2> %<MAIN_CLASS> %<ARGS>

因此,ARGS我们需要找到一种方法来设置FLAGS2.

幸运的是,在选项卡旁边Environment有一个Flags/Args选项卡,我们可以在其中设置我们的 vm 参数FLAGS2

--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls

虚拟机参数

  • 应用,关闭对话框,然后Build -> Run类,现在它可以工作了!

如果您看到控制台日志,它包含您在命令行上运行时将使用的命令:

----jGRASP exec: java --module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls HelloFX

 ----jGRASP: operation complete.

我想下一步将运行一个更复杂的项目......

于 2019-02-13T18:48:29.767 回答
1

尝试简单地创建一个只有一个主要方法的启动器。它可能看起来像这样:

package application;

import javafx.application.Application;

public class MyAppLauncher {

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

(您可以暂时在您的应用程序中不使用旧的主要方法)
这对我在 Ubuntu 下使用 JDK 13 & JavaFX 13 & Eclipse 2019-12 有效。
(我使用“new/Maven Project/Simple Project”创建了项目,然后在 pom.xml 中添加了 JavaFX、Logging 和其他东西作为依赖项,它们都落在 Classpath 上。只有 JDK 在 Modulepath 上)
不需要为 Java 模块烦恼。

如果可行,您可以改天花点时间了解 Java 模块化...
...并记得为这个答案投票。:-)

于 2019-12-28T13:39:38.153 回答