intellij-idea - 在 IDEA 中将 SceneBuilder 与 JavaFX 11 结合使用

标签 intellij-idea javafx scenebuilder javafx-11

我正在使用 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 解析并渲染。

但是如果您尝试自定义控件,在构建项目后,您将得到您提到的异常:

Scene Builder Exception

由于您使用 Java 11 进行编译,现在的级别是 55。

有什么办法可以让它发挥作用吗?如前所述,您所需要做的就是将控件加载到类路径中,但级别为 52。

所以您需要做的就是将项目的目标级别设置为 1.8,在项目结构 -> 项目 -> 项目语言级别

Level 1.8

现在再次构建您的项目,您将能够看到带有嵌入式场景生成器的自定义控件:

Scene Builder with custom control

由于您的项目现在与 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/

相关文章:

scala - 使用 IntelliJ 13 和 SBT 0.13 玩 2.2.2 无法运行 - 未检测到主类

macos - JavaFX native bundle 图标 OS X

java - 如何在 Intellij Idea 场景生成器中使用鼠标重新定位或调整项目大小?

javafx - 如何获取javafx中子节点的访问权限?

JavaFx TableView 列不填充 TableView 宽度

java - 在 unnamed.war 中找不到 META-INF/MANIFEST.MF 文件

java - Webstorm 和 Idea 怎么搭配使用?

java - 使用来自 Google API 的数据在文本字段中自动建议

java - 如何禁用子像素渲染?

JavaFX:将 List<A> 双向绑定(bind)到 List<B> 会抛出 StackOverflowError