在 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.pswp.cn/news/450534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450534.shtml
英文地址,請注明出處:http://en.pswp.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…