javafx 和swing_整合JavaFX和Swing

dnc8371發表於2020-06-04

javafx 和swing

我剛剛完成了對使用Swing的應用程式元件的重寫,現在正在使用JavaFX,最後得到了與更大的swing應用程式整合的JavaFX元件。 這是一個很大的應用程式,重寫花了我一段時間,最後一切都很好,我很高興自己做到了。

您可能想在鞦韆應用中執行此操作的原因

您可能想要重寫Swing應用程式並將其更改為使用JavaFX,最簡單的方法是通過一次更改每個元件來增量執行此操作。 這要求您將每個新更改的JavaFX元件與其餘的Swing應用程式整合在一起。

我將總結為什麼您可能要開始將應用程式從Swing重寫為JavaFX:

  • 這是未來

    從某種意義上講,Swing幾乎已經死了,因為它不會得到任何進一步的發展。 JavaFX是Java的新UI工具包,它為將來提供了更好的準備,例如觸控支援,3D,內建動畫支援,視訊和音訊播放等。

  • 未來可能對移動裝置的支援:Android,IOS…

    從我所看到的情況來看,我認為這可以保證將提供對Android,IOS等的支援,Oracle已經有了可以在公開會議上展示的工作原型,唯一的問題是何時。 我認為用不了多久,可能很快就會在下一個JavaOne中看到更多有關此的資訊。

  • 牢固

    JavaFX是一個經過精心設計的工具包,具有快速增長的步伐,光明的未來和一系列良好的免費UI工具。 此外,與過去不同,Oracle給予開發人員反饋一個非常重要的意義,即更改和調整其API以實現其目標。

  • 好漂亮啊

    與Swing不同,不算第三方庫本身就很醜陋,而JavaFX從一開始就看起來不錯。 鑑於如今的使用者期望外觀設計良好的應用程式,這是一個很好的觀點。

  • 不錯的附加功能

    一些不錯的功能,例如圖表API,支援HTML5的嵌入式瀏覽器等。

你怎麼做

回到JavaFX 1.3,您可以將Swing嵌入JavaFX,但不能反之,至少不是正式的。 我實現了一個Swing元件,該元件允許您將JavaFX內容嵌入到Swing中(稱為JXScene),並將其在jfxtras專案中公開可用。 這是將JavaFX場景嵌入Swing應用程式的唯一方法。

現在,帶有JavaFX 2.X的Oracle成為了將JavaFX嵌入Swing的正式方法,這更有意義,但不幸的是,不是將Swing嵌入JavaFX的方法,但是我想這在大多數情況下就足夠了。

佈置

本質上,當您在Swing中嵌入JavaFX時,最終會有2個正在執行的UI執行緒:Swing EDT執行緒和JavaFX User執行緒。

將來有可能像SWT那樣只有兩個執行緒,這使得Swing在JavaFX User Thread上執行,但是現在我們必須使用2個執行緒來管理方式。

在UI中同時執行的兩個執行緒使問題變得複雜,並且使JavaFX整合不像您預期​​的那樣容易,除非您正在做一些瑣碎的小型應用程式,但我想這不是大多數現實世界中的場景。用例。 如果您正在做一個小型應用程式,那麼最好在JavaFX中完成所有操作。

編碼

JavaFX提供了JFXPanel,它是一個承載JavaFX場景的Swing皮膚。 您可以在JFXPanel上設定場景,然後在可以新增Swing元件的位置新增皮膚。

要訪問JavaFX資料,您必須將程式碼包裝在Runnable物件中,並呼叫Platform.runLater方法:

jbutton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
        Platform.runLater(new Runnable() { 
            @Override
            public void run() {
                fxlabel.setText("Swing button clicked!"); 
            }
        });
    }
});

另一方面是Swing資料。 該資料只能由EDT訪問。 為了確保您的程式碼在EDT上執行,請將其包裝到Runnable物件中並呼叫SwingUtilities.invokeLater :

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        //Code to change Swing data.
    }
});


提示

  1. 當您在JavaFX使用者執行緒之外訪問JavaFX資源時,JavaFX已經引發了異常,但是請記住,這種情況並不總是會發生。 為了最大程度地降低效能成本,並未檢查所有情況。
  2. 如果您使用Substance第三方庫,則每當在EDT外部訪問Swing資源時,也會引發異常。 將Substance設定為Swing的外觀可能是減少Swing方面併發錯誤的好方法。
  3. 在2個UI執行緒之間共享資源時要非常小心,請嘗試儘可能避免這種情況。 解決多執行緒問題的最佳方法是避免它們,而這些問題是軟體工程中最難解決的問題。 Swing最初是從多執行緒工具包開始而最終更改為單執行緒工具包,這是有原因的。
  4. 有時您可能想通過Platform.isFxApplicationThread()檢查您是否在JavaFX使用者執行緒上,而只發出對Platform.runLater(…)的呼叫,因為如果您在JavaFX使用者執行緒上並呼叫runLater(...)內部程式碼的執行仍將推遲到以後,這可能不是您想要的。

其他要簽出的連結:

參考: Pixel Duke部落格上來自JCG合作伙伴 Pedro Duque Vieira的JavaFX和Swing整合


翻譯自: https://www.javacodegeeks.com/2012/08/integrating-javafx-and-swing.html

javafx 和swing

相關文章