2019独角兽企业重金招聘Python工程师标准>>>

JDK 11 把 JavaFX 剥离了出来,形成了单独且开源的 OpenJFX 模块。

本文的目的是通过简单的例子解释这一变化对使用 JavaFX 所造成的影响,并找到一种在 IDEA 2018.2 上使用它的办法。

首先,OpenJFX 官网的入门文档指示我们手动下载 SDK,但在 maven 的帮助下这不是必须的。虽然同样得下载,但这被 maven 自动化了。

我们的 pom.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>sample</groupId><artifactId>javafx</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><mainClass>sample.JFXMain</mainClass><javafx.version>11</javafx.version></properties><dependencies><dependency><groupId>org.openjfx</groupId><artifactId>javafx-controls</artifactId><version>${javafx.version}</version></dependency><dependency><groupId>org.openjfx</groupId><artifactId>javafx-fxml</artifactId><version>${javafx.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version><configuration><source>11</source><target>11</target></configuration></plugin></plugins></build></project>

这里引入了 OpenJFX 的依赖包,并设置了项目的 JDK 版本为 JDK 11。

根据 IDEA 的提示 Import Changes,或者手动:右键 pom.xml - Maven - Reimport。

注意:这里没有使用 maven.compiler.sourcemaven.compiler.target 这两个 property。这两个 property 是作为参数定义在 maven-compiler-plugin 里的,分别对应于源代码的 Java 版本和目标代码的 Java 版本。因为 IDEA 目前对这两项的支持似乎不够好,不能完美地同步到项目设置里。

注意:需要手动检查 Preferences - Build, Execution, Deployment - Compiler - Java CompilerProject bytecode versionPer-module bytecode version 的值是否同为 11。理由同上。

我们的 Java 代码如下:

package sample;import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;public class JFXMain extends Application {@Overridepublic void start(Stage primaryStage) throws Exception{Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml"));primaryStage.setTitle("Hello World");primaryStage.setScene(new Scene(root, 300, 275));primaryStage.show();}public static void main(String[] args) {launch(args);}
}
package sample;public class Controller {
}

OpenJFX 布局描述文件 /src/main/resources/sample.fxml 如下:

<?import javafx.scene.layout.GridPane?>
<GridPane fx:controller="sample.Controller"xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>

Java 模块描述文件 /src/main/java/module-info.java 如下:

module sample {requires javafx.controls;requires javafx.fxml;// 暴露包 sample 给 javafx 的模块们,使其可以在运行时使用反射访问opens sample to javafx.graphics, javafx.fxml;
}

以上便是在 JDK 11 中使用 OpenJFX 所需的全部铺垫了。

常见错误

启动报错:缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序

模块化 Java 程序与非模块化 Java 程序的启动方式有所不同。

# 非模块化
java [options] mainclass [args...]# 模块化
java [options] [--module-path modulepath] --module module[/mainclass] [args...]

提供了 module-info.java 的话,IDEA 发现这是模块化的 Java 程序。以上例为例,启动命令是:

java ${OPTIONS} -m ${METHOD_PATH} -m sample/sample.JFXMain

否则,IDEA 会认为这是非模块化 Java 程序,启动命令是:

java ${OPTIONS} -classpath ${CLASS_PATH} sample.JFXMain

但这报错具体是什么代码引起的呢?我们在 JDK 11 的 sun.launcher.LauncherHelper 发现:如果 JFXMain 继承自 javafx.application.Application,同时程序从 JFXMain.main() 启动,LauncherHelper 会检查是否存在模块 javafx.graphics 的声明:

package sun.launcher;public final class LauncherHelper {static final class FXHelper {private static void setFXLaunchParameters(String what, int mode) {...Optional<Module> om = ModuleLayer.boot().findModule(JAVAFX_GRAPHICS_MODULE_NAME);if (!om.isPresent()) {abort(null, "java.launcher.cls.error5");}...}}
}

显然,如果不以模块化 Java 程序的方式启动,没有模块信息。错误码 java.launcher.cls.error5 即为 “错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序。”

不过我们还有其他办法来绕开 LauncherHelper 的检查,能够以非模块化 Java 程序的方式运行程序。思路是:使程序的入口 main() 不继承自 javafx.application.Application

因此,我们可以使用 maven 来运行程序,因为 maven 的 main() 显然满足该要求。这用到了 exec-maven-plugin,这个插件是默认包含的,我们可以直接使用它的 property exec.mainClass

修改 pom.xml

<properties>...<exec.mainClass>sample.JFXMain</exec.mainClass>...
</properties>

运行命令如下:

mvn clean compile exec:java

除此之外,我们也可以单独创建一个启动类:

package sample;import javafx.application.Application;public class AppMain {public static void main(String[] args) {Application.launch(JFXMain.class, args);}
}

从这个类启动 Java 程序,效果相同。

编译报错:Error: (4, 1) java: -source 8 中不支持 模块

根据上文所述的方法,检查并修改 Project bytecode version。


原文链接 https://blog.xupu.name/p/using-openjfx-in-intellij-idea/

转载于:https://my.oschina.net/tridays/blog/2222909

在 Intellij IDEA 里使用 OpenJFX (JavaFX)相关推荐

  1. 在IntelliJ IDEA里创建Spring Boot项目

    IntelliJ IDEA是非常流行的IDE,IntelliJ IDEA 14.1已经支持Spring Boot了! 要在IntelliJ IDEA里创建新的Spring Boot应用程序,在File ...

  2. 在IntelliJ IDEA里配置Go开发环境

    文章目录 一.Go语言概述 1.Go 语言特色 2.Go 语言用途 二.下载Go安装包 三.安装Go开发工具 四.第一个Go程序 1.编写源程序HelloWorld.go 2.直接运行程序HelloW ...

  3. Intellij IDEA里的md5验证

        在网页登录界面里,常常需要输入用户的账户和密码,这个密码会在加盐之后,再取MD5,然后,与数据库里的MD5进行比较,若相同说明密码是正确的,若不同说明密码错误.     下面介绍,在Intel ...

  4. 报错:Cannot resolve org.openjfx:javafx.base:11.0.0-SNAPSHOT

    问题:在使用idea导入项目,pom文件导入报错: Cannot resolve org.openjfx:javafx.base:11.0.0-SNAPSHOT 解决办法: 这是因为无法识别jdk,只 ...

  5. 大佬,IntelliJ IDEA里这种文件是怎么创建的?

    请问在IntelliJ IDEA里这种文件是怎么创建的? 就是那个田字格一样的  每次进idea的tips里都有 我也不知道是啥怎么创建 第一次发帖 希望能得到大佬们的帮助 你创建当前项目就有吧, 你 ...

  6. openjfx(javaFX)完整学习指南(教程)

    openjfx(javaFX)介绍 基于JavaSE8,openjfx由几个组件构成:图形引擎Prism,窗体引擎glass,媒体引擎和一个web引擎. 欢迎大家积极开心的加入讨论群,群号:60842 ...

  7. 在IntelliJ IDEA 中使用 Gradle JavaFx

    简述 使用 Gradle 构建 Java 工程时,没有 JavaFx 的选项,所以需要自己添加. 注:此例程以一个串口调试助手为例程,所以工程名为 SerialAssistant 本工程源码 Java ...

  8. IntelliJ IDEA里对Lombok插件的配置步骤

    经同事推荐,我从用了多年的Eclipse换成了IntelliJ IDEA.

  9. 关于Intellij idea里在pom.xml里添加Maven依赖,本地仓库下拉列表显示包很少的血的经验

    博主在学习idea结合maven使用时遇到的问题,当时折腾可好久,现在把经验记下来,希望对别人也有帮助. 问题描述: 前提是我配好了自己的自定义本地仓库地址,settings.xml也配好了 在pom ...

最新文章

  1. 网络推广外包“重拳出击”中小企业网站优化力求超越网络推广外包行业站
  2. 阿里巴巴的五大平台野心,让“连接”论成为过去式
  3. javaweb开发的准备工作——配置篇
  4. 雷林鹏分享:PHP If...Else 语句
  5. 快手宣布任命金秉为首席财务官 向程一笑汇报
  6. Fancybox丰富的弹出层效果
  7. [转载]使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放...
  8. SyntaxError: Non-ASCII character ‘\xe4‘ in file baseline.py on line 18, but no encoding declared;
  9. linux之终端的灵活使用。SCREEN
  10. 汇添富基金总经理张晖:做选股专家,更以“选股专家”的视角管理公司
  11. Segmentree beats!---吉如一线段树学习笔记
  12. 计算机专业的技能测试,中职学校计算机专业技能测试方法存在的主要问题及其对策...
  13. 每个人心中都有一个Eumenides
  14. makefile编写总结
  15. 面试公司Offer——我的Python求职之路
  16. Linux下Oracle 11g安装(2)—— 系统准备篇
  17. 用 pandas 实现真实的Vlookup
  18. Hamming Distance汉明距离
  19. VBA用字典实现分类汇总(一)
  20. 行波进位加法器C语言,行波进位加法器.doc

热门文章

  1. mysql 取交集 php_mysql 查询结果取交集的方法
  2. java实现ListObject转List实体类,java实现Object转对象,java实现Object转实体类
  3. 算法(12)-leetcode-explore-learn-数据结构-双链表的设计
  4. php 实现的n,php 实现数据N等分。
  5. 车祸是怎么发生的 不论你是否开车都该看看!
  6. 推荐16款最棒的Visual Studio插件
  7. 九月腾讯,创新工场,淘宝等公司最新面试三十题(更新至10.04)
  8. C语言的面向对象设计-对X264/FFMPEG架构探讨
  9. 解决:vue 用 axios 发送请求,每次都会发送两次请求
  10. UDP:用户数据报协议 是什么