我正在使用Java, JavaFX和Gradle开发IntelliJ插件项目。
我可以成功地以编程方式创建JavaFX元素。如果我尝试使用fxml文件和FXMLLoader插件失败,由于JavaFX .fxml. loadexception:JavaFX类不是一个有效的类型错误。我怀疑这是gradle的一个简单的依赖问题,但我在这一点上绕了一圈。所以我的主要问题是为什么以编程方式构建JavaFX类工作,但使用FXMLLoader不。如果需要额外的信息,我会很高兴分享它-只要让我知道。以下是我认为相关的内容。谢谢你的帮助。
异常信息:
javafx.fxml.LoadException: HBox is not a valid type.
file:/D:/Projects/IU-P532-Assignments/FinalProject-Team3/build/idea-sandbox/plugins/p532.fall21.finalproject.team3/lib/p532.fall21.finalproject.team3-1.0-SNAPSHOT.jar!/HeatMapScene.fxml
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2621)
at javafx.fxml.FXMLLoader.createElement(FXMLLoader.java:2789)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2719)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3237)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106)
at intellij_extension.TestToolWindowFactory.lambda$createToolWindowContent$0(TestToolWindowFactory.java:32)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
at java.base/java.lang.Thread.run(Thread.java:829)
下面是代码片段:
//Load in the XML of the test window
// This throws exception
Parent playRoot = FXMLLoader.load(getClass().getClassLoader().getResource("HeatMapScene.fxml"));
// This will work properly
Parent playRoot = new HBox();
下面是fxml文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.FlowPane?>
<?import javafx.scene.layout.HBox?>
<HBox id="hboxHeatMapSceneRoot" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<FlowPane id="flowPnHeatFileContainer" prefHeight="400.0" prefWidth="420.0"/>
</children>
</HBox>
这是我的构建。gradle文件:
plugins {
id 'java'
id 'org.openjfx.javafxplugin' version '0.0.7'
id 'org.jetbrains.intellij' version '1.2.1'
}
group 'p532.fall21.finalproject.team3'
version '1.0-SNAPSHOT'
sourceCompatibility = 11
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
// See https://github.com/JetBrains/gradle-intellij-plugin/
intellij {
version = '2021.2.3'
}
runIde {
jvmArgs = [
'--add-exports',
'java.base/jdk.internal.vm=ALL-UNNAMED'
]
}
patchPluginXml {
changeNotes = """
Add change notes here.<br>
<em>most HTML tags may be used</em>"""
}
test {
useJUnitPlatform()
}
javafx {
modules = ['javafx.controls', 'javafx.fxml']
version = '11.0.2'
}
我也遇到了同样的问题,找了几个小时也找不出来。
最终我发现JavaFX不再支持Intellij: https://blog.jetbrains.com/platform/2020/07/javafx-and-jcef-in-the-intellij-platform/