问题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
中配一遍也不行。文章图片
使用 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个文件拿过来放在对应目录,如图。文章图片
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
文件夹,然后把界面文件放这里面,这样子一目了然,下次也不会忘了根目录要加/
又出问题了推荐阅读
- parallels|parallels desktop 解决网络初始化失败问题
- 你到家了吗
- 闲杂“细雨”
- 杜月笙的口才
- 赢在人生六项精进二阶Day3复盘
- jhipster|jhipster 升级无效问题
- 祖母走了
- 樱花雨
- 眼观耳听美食的日子
- “成长”读书社群招募