本文导航

  • 起因
  • 错误原因
  • 解决办法
  • 第一步:下载 OpenJFX 包
  • 第二步:设置环境变量
  • 第三步:重新编译画板程序 & 运行
  • 使用 PowerShell
  • 使用命令行窗口(cmd)
  • 需要改进之处


起因

最近在学习 Paul Deitel 和 Harvey Deitel 编写的 Java 编程入门教材《Java: How to Program - Early Objects 11th Edition》

java native 找不到方法 找不到javax_JavaFX

其中第 1 章第 1.10 节给出一个简易画板示例程序,是一个 JavaFX GUI 程序

其目录结构如下

java native 找不到方法 找不到javax_java native 找不到方法_02

按书上给的命令 javac *.java 编译时出现如下错误,编译失败

java native 找不到方法 找不到javax_Java_03

以上错误皆可统一归结为一个源头:编译器找不到 JavaFX 包

错误原因

本书使用的 Java 版本是 Java 8

而我使用的是 Java 17

然而从 Java 11 开始,JavaFX 包就不再被包含到 JDK 里

解决办法

第一步:下载 OpenJFX 包

OpenJFX 是 Oracle 将 JavaFX 从 JDK 中分离出来后,维护的一个开源版 JavaFX

首先来到 OpenJFX 主页,点击 Download

java native 找不到方法 找不到javax_Java_04

跳转到 Gluon 维护的 JavaFX 下载页面

向下滚动,选择要下载的版本。这里有一个问题:如果想要免费使用,你只能下载与当前最新 Java 版本号相同的 JavaFX 包,或者下个 Java 版本的预览包

例如,我使用的是 Java 17,但目前(2023年1月)最新的 Java 版本是 19,那么我没法免费使用 JavaFX 17,只能下载 JavaFX 19,网页会在一个支付页面和本页之间无限循环跳转

但这个问题无关紧要,因为 JavaFX 包向后兼容,Java 17 可以用 Java 19 的包

依次选好 JavaFX 版本、操作系统、指令集架构、类型一栏选 SDK,然后点击 Download

java native 找不到方法 找不到javax_java_05

下载下来的是一个 .zip 格式压缩包,解压后打开,发现目录下只有一个文件夹

java native 找不到方法 找不到javax_Java_06

把这个文件夹移动到一个你喜欢的位置,记住这个位置

第二步:设置环境变量

如果想让 Java 编译器在编译时找到 JavaFX 包,那么需要在编译时通过编译选项 --module-path 指定好 JavaFX 包所在的路径。

但路径太长,编译时输入很麻烦。为了方便,我们给这个路径设置一个环境变量来指代它,到时直接用环境变量名即可。

打开“Windows设置”,点击左上角“系统”,点击左侧边栏最底下“关于”,找到右侧边栏“相关设置”,点击“高级系统设置”

弹出窗口,点击“环境变量”

弹出窗口,找到下方“系统变量”,点击“新建”

java native 找不到方法 找不到javax_JavaFX_07

起一个变量名,最好只使用大写字母和下划线,方便你自己识别,我这里起名 JFX_PATH

然后点击“浏览目录”,弹出窗口,还记得上一步你把 JavaFX SDK 放在哪里吗?找到它,打开,选中 lib 文件夹,点击“确定”

然后“确定”,关闭环境变量窗口

环境变量不是即时生效的,需要注销或者重启,才可生效,注意:注销或重启之前一定要保存好电脑上正在进行的其他工作!

第三步:重新编译画板程序 & 运行

参考文章:https://openjfx.io/openjfx-docs/#install-javafx

使用 PowerShell

执行编译命令如下

javac --module-path $env:JFX_PATH --add-modules javafx.controls javafx.fxml *.java

如果没有报错,且目录下生成 .class 文件,执行运行命令如下

java --module-path $env:JFX_PATH --add-modules javafx.controls javafx.fxml Painter

使用命令行窗口(cmd)

执行编译命令如下

javac --module-path %JFX_PATH% --add-modules javafx.controls javafx.fxml *.java

如果没有报错,且目录下生成 .class 文件,执行运行命令如下

java --module-path %JFX_PATH% --add-modules javafx.controls javafx.fxml Painter

java native 找不到方法 找不到javax_Java_08

成功!

需要改进之处

我们发现这样输命令还是太长,太麻烦,可以通过给命令设置别名,或者在 PowerShell 的配置文件里设置 function 来缩短命令,省去不必要的打字环节

具体方法不在此赘述,可自行搜索

(本文完)