问题s|在IntelliJ IDEA中使用 JAVAFX 的问题


文章目录

    • 准备工作
    • 使用命令行简单编译
    • 使用 gradle 编译

准备工作 javafx 在java11以后被单独分开了,在这里下载SDK,教程在这里
使用命令行简单编译 idea能直接生成JAVAFX项目,根据教程在项目属性里添加好lib依赖,代码就不报错了,但是需要添加 vm option 的参数才可以编译运行。
好的,坑来了,当你根据教程配置好 PATH_TO_FX 的环境变量,并且在命令行 echo 通过了没有问题,配置进 vm option的时候,会告诉你 FindException: Module javafx.base not found
D:\develop_env\jdk11\bin\java.exe --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml --add-modules javafx.base,javafx.graphics --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2\lib\idea_rt.jar=62234:C:\Program Files\JetBrains\IntelliJ IDEA 2020.2\bin" -Dfile.encoding=UTF-8 -classpath D:\demos\aaa\out\production\aaa; D:\develop_env\javafx-11.0.2\lib\src.zip; D:\develop_env\javafx-11.0.2\lib\javafx-swt.jar; D:\develop_env\javafx-11.0.2\lib\javafx.web.jar; D:\develop_env\javafx-11.0.2\lib\javafx.base.jar; D:\develop_env\javafx-11.0.2\lib\javafx.fxml.jar; D:\develop_env\javafx-11.0.2\lib\javafx.media.jar; D:\develop_env\javafx-11.0.2\lib\javafx.swing.jar; D:\develop_env\javafx-11.0.2\lib\javafx.controls.jar; D:\develop_env\javafx-11.0.2\lib\javafx.graphics.jar sample.Main Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.base not foundProcess finished with exit code 1

但是,当你用命令行测试的时候,没问题的啊,这就很蛋疼了,我以为是后面加的参数配错了,找了半天,原来IDEA里不支持这么调用环境变量。需要把路径直接加入 vm option 才可以,教程里的变量写法不行的,就算在IntelliJ->File->Settings->Appearance & Behavior->Path Variables 中配一遍也不行。
问题s|在IntelliJ IDEA中使用 JAVAFX 的问题
文章图片

使用 gradle 编译 好的,跨过第一个坑,那么用 gradle 或者 maven 工具进行模块化编译打包,我选了gradle,maven太丑。
根据教程,建立一个gradle + java项目,添加一个 module-info.java 文件,注意需要加在src/java的下面,和代码包根目录平级,这里仔细点没什么问题,贴一下, module 的 name 可以自定义。
module javafx { requires javafx.controls; requires javafx.fxml; opens tech.sunyx.sample to javafx.fxml; exports tech.sunyx.sample; }

plugins { id 'application' id 'org.openjfx.javafxplugin' version '0.0.8' id 'org.beryx.jlink' version '2.12.0' }group 'sunyx.tech' version '1.0.0'javafx { version = "11.0.2" modules = [ 'javafx.controls','javafx.fxml' ] } mainClassName = "$moduleName/tech.sunyx.sample.Main"jlink { launcher { name = 'test.exe' } }repositories { mavenCentral() jcenter() //flatDir { dirs 'libs' } }dependencies { testImplementation 'junit:junit:4.12' }

并添加build.gradle配置好 gradle 插件,gradle 版本我用的6.3 。然后建立比较正式的项目结构,把刚刚那个项目的3个文件拿过来放在对应目录,如图。
问题s|在IntelliJ IDEA中使用 JAVAFX 的问题
文章图片

Exception in Application start method java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051) Caused by: java.lang.RuntimeException: Exception in Application start method at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.lang.NullPointerException: Location is required. at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3230) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136) at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113) at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106) at javafx/tech.sunyx.sample.Main.start(Main.java:13) 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(Native Method) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at 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) ... 1 more Exception running application tech.sunyx.sample.MainFAILURE: Build failed with an exception.* What went wrong: Execution failed for task ':run'. > Process 'command 'D:\develop_env\jdk11\bin\java.exe'' finished with non-zero exit value 1* Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.* Get more help at https://help.gradle.org

【问题s|在IntelliJ IDEA中使用 JAVAFX 的问题】看似没有问题,run 一下又报错了。告诉我13行 Location is required.,文件明明放好了,名字也对,加了debug参数也看不出什么来。其实fxml文件放到Resource文件夹之后,虽然在根目录,但是需要加个 /,很容易忽略的问题。我的做法是 resource 文件夹下按照 android 的目录格式建立了一个layout文件夹,然后把界面文件放这里面,这样子一目了然,下次也不会忘了根目录要加/又出问题了

    推荐阅读