在 Intellij IDEA 里使用 OpenJFX (JavaFX)

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用phpunit新建项目

1、mkdir test-project 新建一个test-project 2、cd test-project 跑到文件夹中 3、实例化git git init 4、新建phpunit项目 composer require --dev phpunit/phpunit 5、使用gi实例化.gitignore gi composer>.gitignore (如果没有安装gi&#xff0c;请使用命令ec…

如何解决eclipse里面tomcat 8080端口被占用

很多时候运行tomcat 的时候总是会提示tomcat 的端口被占用 但是任务管理器里面还找不到是哪个端口被占用了 因此很多人就重新配置tomcat 或者去修改tomcat的端口号 &#xff0c;其实这么做太麻烦了 &#xff0c;小弟在这里告诉你一个非常简单的方法。 1.在开始菜单中选择运行 …

Selenium UI 举例 getCssValue

selenium jar包中&#xff0c;在WebElement的接口中&#xff0c; String getCssValue(String var1);可以通过标签&#xff0c;获取对应的css值。具体要怎么用呢&#xff0c;如下&#xff1a; WebElement baidu driver.findElement(By.id("su"));su.getCssValue(&quo…

java集合框架中contains(),containsKey()和containsValue()的用法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 java集合框架中contains(),containsKey()和containsValue()的用法&#xff1a; List集合的contains()方法用于判断集合中包不包含某个元…

敏捷视频

规模化极限编程的关键抓手&#xff1a;验收条件https://mp.weixin.qq.com/s/aHlSxpMx7DTQXaoEgcAQ3g 5分钟让你子解持续集成https://www.bilibili.com/video/BV1SK411W77W/?spm_id_fromtrigger_reload 5分钟让你学会返工率降低1倍的神技--开卡、验卡https://www.bilibili.com/…

提问的智慧

提问的智慧转载于:https://www.cnblogs.com/whigym/p/10028642.html

C语言指针和数组概述

几乎每次讲课讲到指针和数组时&#xff0c;我总会反复不停的问学生&#xff1a;到底什么是指针&#xff1f;什么是数组&#xff1f;他们之间到底是什么样的关系。从几乎没人能回答明白到几乎都能回答明白&#xff0c;需要经历一段“惨绝人寰”的痛。指针是C/C的精华&#xff0c…

Linux tee的花式用法和pee

1.tee多重定向 tee [options] FILE1 FILE2 FILE3... tee的作用是将一份标准输入多重定向&#xff0c;一份重定向到标准输出/dev/stdout&#xff0c;然后还将标准输入重定向到每个文件FILE中。 例如&#xff1a; $ cat alpha.log | tee file1 file2 file3 | cat $ cat alpha.log…

[CF893F]Subtree Minimum Query

题目大意&#xff1a; 给你一颗有根树&#xff0c;点有权值&#xff0c;m次询问&#xff0c;每次问你某个点的子树中距离其不超过k的点的权值的最小值。&#xff08;边权均为1&#xff0c;点权有可能重复&#xff0c;k值每次询问有可能不同&#xff0c;强制在线&#xff09; 做…

mac电脑快捷键(持续更新)

1、快速查找软件 commandspace 2、显示/隐藏文件夹 shiftcmmand. 3、路径输入 commandshiftg 4、快速打开软件 commandtab 5、截图 commandshift3 commandshift4 6、注销 Command-Shift-Q 7、强制注销 ommand-Shift-Option-Q 8、睡眠 controlshift电源键 9、选…

C语言typedef关键字—伟大的缝纫师

关于马甲的笑话。有这样一个笑话&#xff1a;一个猎人在河边抓捕一条蛇&#xff0c;蛇逃进了水里。过一会&#xff0c;一个乌龟爬到岸边。猎人一把抓住这个乌龟&#xff0c;大声的说道&#xff1a;小样&#xff0c;别你为你穿了个马甲我就不认识你了&#xff01;typedef 关键字…

将网桥的配置写进去/etc/sysconfig/network-scripts/ifcfg-xxx

有时候需要使用网桥命令比如brctl设置一些网桥的属性&#xff0c;而这些方式能否同样写进去配置文件使其永久开机生效。 答案是不行的&#xff0c;也同样找过Ubuntu的&#xff0c;其实Ubuntu可以实现&#xff0c;参考&#xff1a;http://manpages.ubuntu.com/manpages/cosmic/m…

phpstorm如何回滚。并取消本地提交

1、现在我提交到本地 当前git版本为4b53dca9 上一版本为965cdf14 2、现在执行回滚操作&#xff0c;取消本地提交 版本复制到这里&#xff0c;点击reset就会回滚了 如需使用git命令操作&#xff0c;请参考链接https://blog.csdn.net/qq_35774849/article/details/107313193

windows server 2008 R2 x64 基础知识(2)

一、防火墙设置 1.windows防火墙的种类&#xff1a; 1)工作组网络环境 2)域网络环境 2.防火墙的配置 1)打开管理工具&#xff1a;win->管理工具->高级安全windows防火墙 2)管理配置&#xff1a; (1)防火墙的数据流类型 a.入站流量&#xff1a;外部访问内部分流量 b…

SOA 说明,解析

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一直对SOA这个概念不甚明了&#xff0c;再度记录下&#xff1a; 一、是一个面向服务的架构&#xff0c;是一种思想、规则。而不是一个确…

Windows API 第二篇 SHGetSpecialFolderPath

BOOL SHGetSpecialFolderPath( HWND hwndOwner, LPTSTR lpszPath, int nFolder, BOOL fCreate ); 参数解释&#xff1a; hwndOwner&#xff1a;Handle to the owner wind…

面向对象—的__new__()方法详解

[Python] Python 之 __new__() 方法与实例化 __new__() 是在新式类中新出现的方法&#xff0c;它作用在构造方法建造实例之前&#xff0c;可以这么理解&#xff0c;在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化&#xff0c;而在 __init__() 启动之前&#…

git使用回滚,清除暂缓区,解决冲突(持续更新)

1、git restore --staged <文件> 清除暂缓区文件名 2、git reset --hard <版本号> 回滚到上一版本 如看PHPstrom如何操作请参考https://blog.csdn.net/qq_35774849/article/details/107312658 3、解决冲突 &#xff08;1&#xff09;使用默认的解决冲突 打开…

14.安全

1.基本概念 安全问题的产生&#xff1a; 互联网作为商业交易的工具快速发展&#xff0c;越来越多的公司提供网络交易服务。很多商业活动在网上进行当前&#xff0c;成千上万的网民在网上进行各种活动的同时&#xff0c;也在网上传递其个人信息每天在网上发生各种各样的商业活动…

C语言enum关键字

很多初学者对枚举(enum)感到迷惑&#xff0c;或者认为没什么用&#xff0c;其实枚举(enum)是个很有用的数据类型。一、枚举类型的使用方法 一般的定义方式如下&#xff1a;enum enum_type_name{ENUM_CONST_1,ENUM_CONST_2,...ENUM_CONST_n} enum_variable_name;注意&#xff1a…