在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 found

Process finished with exit code 1

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

在IntelliJ IDEA中使用 JAVAFX 的问题_第1张图片

使用 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个文件拿过来放在对应目录,如图。

在IntelliJ IDEA中使用 JAVAFX 的问题_第2张图片

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.Main

FAILURE: 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

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

你可能感兴趣的:(问题s,java,javafx,gradle)