天天看點

如何從IntelliJ IDEA内部運作JavaFX應用程式?

在過去的六年裡,我一直在我的一些示範應用程式中使用JavaFX,我了解到的一件事是,它是一個移動的目标,特别是在Java 11中JavaFX被從JDK中移除之後。我想知道的是,目前建立一個新的JavaFX應用程式的最佳方法是什麼,以及如何從IntelliJ IDEA内部運作它?

點選下載下傳IntelliJ IDEA最新版

建構工具和JavaFX

JavaFX并不像你在應用中可能使用的其他庫那樣簡單依賴。我們不能在Maven或Gradle檔案中添加一個新的依賴關系,然後直接開始使用它,這主要是因為UI架構比其他類型的架構更依賴于你的作業系統。這主要是因為UI架構比其他類型的架構更依賴于你的作業系統,是以建構工具需要為你的作業系統引入正确的依賴關系。

在我的JavaFX應用中使用過Maven和Gradle,我看到了這兩種工具所采取的方法。由于這兩個建構工具都很流行,是以我想把它們都介紹一下。

使用Java子產品系統

應用程式示例代碼

如果你想要與IntelliJ IDEA、JavaFX和Gradle一起工作的無縫體驗,并且你可以自由地做出所有的架構決策,可以嘗試使用Java的子產品系統(在Java 9中引入)建立一個子產品化的應用程式。對像我們在這裡編寫的示範應用這樣的小應用來說,唯一真正影響的是一個額外的檔案,子產品-info.java。

在使用子產品時有很多微妙的地方,我在這個例子中不會涉及。最主要的是,你需要注意的是,子產品化應用使用的是子產品路徑,而不是我們熟知和喜愛的classpath。

OpenJFX入門文檔介紹了如何建立這樣的應用程式(按照菜單項 "JavaFX和IntelliJ"->"Gradle子產品化")。

如何從IntelliJ IDEA内部運作JavaFX應用程式?

然而,如果你使用的是Gradle 6.7或以上版本(如果你從IntelliJ IDEA 2020.3建立了一個Gradle應用程式,就會是這樣),JavaFX Gradle Plugin(0.0.9版本)就不能做所需的事情,因為Gradle改變了它建構使用Java子產品系統的應用程式的方式。你需要把你的build.gradle檔案改成類似的樣子。

plugins {
id 'application'
}
group 'com.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
def javaFXPlatform = getJavaFXPlatform()
def javaFXVersion = "15.0.1"
dependencies {
// you need a dependency for each of the JavaFX modules you're going to use
implementation "org.openjfx:javafx-base:${javaFXVersion}:${javaFXPlatform}"
implementation "org.openjfx:javafx-controls:${javaFXVersion}:${javaFXPlatform}"
implementation "org.openjfx:javafx-graphics:${javaFXVersion}:${javaFXPlatform}"
}
application {
//Java Module System module name
mainModule.set('com.example.javafxgradle')
//Your JavaFX application class
mainClass.set('com.example.javafxgradle.HelloFX')
}
java {
// this enables Java Modularity in Gradle (version 6.7 and above)
modularity.inferModulePath.set(true)
}
// Based on this StackOverflow answer: https://stackoverflow.com/a/65209664/653519
private static String getJavaFXPlatform() {
def currentOS = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem;
if (currentOS.isWindows()) {
return 'win'
} else if (currentOS.isLinux()) {
return 'linux'
} else if (currentOS.isMacOsX()) {
return 'mac'
}
return null
}
           

該應用程式從指令行(或IntelliJ IDEA終端視窗)運作,并具有:

/.gradlew run

(您将需要JAVA_HOME至少指向JDK 11的a)

它通過application -> run任務從Gradle工具視窗運作

如何從IntelliJ IDEA内部運作JavaFX應用程式?

我們可以從HelloFX.java檔案中運作它,可以從裝訂線中的綠色箭頭,也可以通過⌃⇧R(MacOS)或Ctrl + Shift + F10(Windows)運作它。

我使用Java 15作為項目SDK。但是,它也應與JDK 11或更高版本一起運作。

如何從IntelliJ IDEA内部運作JavaFX應用程式?

如果您不熟悉Java子產品系統,則可能不想在JavaFX應用程式中使用它。如果是這種情況,請繼續閱讀,因為您需要了解一些注意事項和解決方法。

沒有子產品

示例應用程式代碼在此處。

最簡單的Gradle方法應該是在沒有Java子產品系統的情況下使用Gradle。

按照OpenJFX入門文檔中的步驟(導航到 "JavaFX和IntelliJ IDEA "下的 "Non-modular with Gradle "的連結),或者克隆/下載下傳示例應用程式代碼。請注意,如果你沒有使用Java子產品系統,JavaFX Gradle插件會做所有你需要的事情,不管你使用的Gradle版本如何,是以你的build.gradle檔案比上面顯示的版本更簡單。

與子產品化版本一樣,您可以使用以下指令從指令行運作此JavaFX應用程式:

/.gradlew run

或者您可以run通過Gradle工具視窗運作任務,如上所示。或者,您可以使用“執行任何操作”(Ctrl Ctrl)并輸入gradle run。

如何從IntelliJ IDEA内部運作JavaFX應用程式?

注意

請注意,如果HelloFX.java從IntelliJ IDEA編輯器内部運作檔案,則該檔案可能不起作用。

這不是一個大問題,因為您仍然可以使用其他方法,并且通過IntelliJ IDEA運作Gradle指令仍會将其添加為有效的運作配置。

如何從IntelliJ IDEA内部運作JavaFX應用程式?

JavaFX與Maven

此處的示例應用程式代碼

獲得使用Maven的JavaFX應用程式的最簡單方法是JavaFX Maven Archetype。使用OpenJFX入門文檔,按照 "JavaFX和IntelliJ"->"Modular with Maven"(或 "Non-modular with Maven",在寫這篇文章的時候,這兩種方法的結果似乎是一樣的)下的說明進行操作。

使用原型的好處是,所有的基本代碼都會為你生成,你什麼都不用做。你應該最終得到一個像我的javafx-maven-via-archetype代碼這樣的項目。

生成的應用程式使用了Java 9中引入的Java子產品系統,這對于一個簡單的應用程式來說應該是沒有問題的,但值得注意的是,萬一你遇到任何意外的行為。

該應用程式從指令行(或IntelliJ IDEA終端視窗)運作,并具有:

mvn clean javafx:run

(假設你已經安裝了Maven)

你也可以從App.java的水溝裡的綠色箭頭處運作它。

如果你想運作我的示例應用程式,你需要使用Java 15,我在Maven中特别設定了它為JDK。

注意

通過Maven的工具視窗運作可能會失效。

如果你的作業系統的JAVA_HOME低于Java 15(例如,我的系統設定為Java 11),你在工具視窗中運作javafx:run會出現錯誤。

如何從IntelliJ IDEA内部運作JavaFX應用程式?

沒有子產品

并非每個人都希望或需要在其應用程式中使用Java子產品系統(盡管我建議人們嘗試一下)。在這種情況下,您可以繼續按照上述步驟建立應用程式,但是删除module-info.java檔案。在中pom.xml,從中删除子產品名稱mainClass。例如,更改此:

<mainClass>com.mechanitis.demo.javafxmaven/com.mechanitis.demo.javafxmaven.App</mainClass>

           

對此:

<mainClass>com.mechanitis.demo.javafxmaven.App</mainClass>

           

注意:

如果你使用no-modules的方法,你仍然可以像以前一樣從指令行運作應用程式,但你将無法通過編輯器運作它,也就是說,你既無法從水溝中的綠色箭頭運作App.java,也無法通過⌃⇧R(MacOS)或Ctrl+Shift+F10(Windows)運作App.java。

Maven 注釋:

IntelliJ IDEA Reactive Spring Boot教程,其中有一個JavaFX前端,使用Maven。我已經将它更新為使用Java 15和JavaFX 15.0.1,它沒有使用Java子產品化,似乎可以正常工作--無論是從指令行運作還是從IntelliJ IDEA運作UI應用類。

我還沒有弄清楚這是為什麼,我的假設是由于Spring照顧了很多的依賴關系。随意翻翻代碼吧。

總結:

建立JavaFX應用程式就像使用任何其他架構一樣--了解如何開始,以及各種方法的優缺點是什麼,是成功的關鍵。在過去五年左右的時間裡,JavaFX經曆了激動人心的時刻,很高興看到我們可以在前端以及應用程式的後端使用Java。

如果你的應用程式使用的是JavaFX前端,如果在你選擇的建構工具中配置正确,你可以在IntelliJ IDEA中建構和運作它。

好了這就是今天的内容了,如果今天的文章未解決你的需求,可點選擷取更多免費教程。