我正在使用 IDEA(带有 OpenJDK 11),并且我正在尝试使用 SceneBuilder 来显示我的 FXML 文件。它可以工作,除非我使用继承的 JavaFX 组件,例如:
public class MyLabel extends Label {
public MyLabel(){
super();
setText("42");
}
}
我总是收到错误:
java.lang.UnsupportedClassVersionError: sample/MyLabel has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
所以我查看了我的IDEA安装文件夹(C:\Users\me\AppData\Local\JetBrains\Toolbox\apps\IDEA-C\ch-0\xxx.xxxx.xxx\plugins\javaFX\lib),我看到 IDEA 使用的是 SceneBuilder 的 Java 8 版本(“SceneBuilderKit-8.2.0.jar”)。
我想知道如何使用Java 11 version在想法中。我已经尝试在参数中填充SceneBuilder路径,但没有成功。
最佳答案
如果 IntelliJ 的嵌入式 Scene Builder 版本是 8.2,那么您不能指望它可以“渲染”为大于 8(级别 52)的 Java 版本编译的类路径中的任何类。
嵌入式场景生成器只是另一个运行的 Java 应用程序,基本上是一个嵌入在 IntelliJ 编辑器之上的 Swing 组件中运行的 JavaFX 应用程序。
Java 8
为了处理使用内置控件的常规 FXML 文件,Scene Builder 使用 JDK 将 jfxrt.jar
加载到类路径。
如果您使用 Java 8 创建自己的自定义控件(此 question 有一个关于如何执行此操作的很好的示例),并且您在尝试使用场景生成器时不编译该项目你会得到一个ClassNotFoundException
,因为该控件不在类路径中,并且场景生成器不知道如何处理它。
但是在构建项目后,生成的类也会添加到类路径中,并且您可以看到呈现的控件。
Java 11
如您所知,当您使用 Java 11 创建自定义控件时,不再有 jfxrt.jar
。
按照入门 docs 进行操作,您需要添加JavaFX 11 SDK到您的项目和虚拟机选项
--module-path ${PATH_TO_FX} --add-modules=javafx.controls,javafx.fxml
为了运行该项目。
如果您有一个常规 FXML 文件,仅包含内置控件,并转到嵌入式场景生成器,它将加载并渲染它。这是为什么?因为它可能使用 IntelliJ 附带的内部 JDK 1.8,所以 FXML 文件(包含纯 xml,而不是 java 文件!)可以由 (Java 8) FXMLLoader
解析并渲染。
但是如果您尝试自定义控件,在构建项目后,您将得到您提到的异常:
由于您使用 Java 11 进行编译,现在的级别是 55。
有什么办法可以让它发挥作用吗?如前所述,您所需要做的就是将控件加载到类路径中,但级别为 52。
所以您需要做的就是将项目的目标级别设置为 1.8,在项目结构 -> 项目 -> 项目语言级别
现在再次构建您的项目,您将能够看到带有嵌入式场景生成器的自定义控件:
由于您的项目现在与 Java 8 兼容,您可以验证是否能够运行:
/path-to-java-8/java -jar out/production/Custom_jar/Custom.jar
无论如何,如果你不想要那个级别,你当然可以保留 Java 11 并使用独立的 Scene Builder 11 .
关于intellij-idea - 在 IDEA 中将 SceneBuilder 与 JavaFX 11 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53509991/