集成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() { @Overridepublic void run() {fxlabel.setText("Swing button clicked!"); }});}
});

另一方面是Swing數據。 該數據只能由EDT訪問。 為確保您的代碼在EDT上運行,請將其包裝到Runnable對象中,然后調用SwingUtilities.invokeLater :

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


提示

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

其他鏈接簽出:

  • Oracle教程: http : //docs.oracle.com/javafx/2/swing/jfxpub-swing.htm

參考: Pixel Duke博客上來自JCG合作伙伴 Pedro Duque Vieira的JavaFX和Swing集成 。


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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371642.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

提示錯誤:“應為“providerInvariantName”參數的非空字符串。”

我在調試Petapoco的T4模版的時候&#xff0c;鏈接一直報如題那個錯誤。在定性問題為配置文件后找的原因如下&#xff1a; <connectionStrings><add name"這個不行" connectionString"Data Sourcexxx;Initial Catalog數據庫名;User ID帳號;Password密碼…

php oop面試題,PHP面試題 - 對面向對象的理解

具體的題目應該是&#xff1a;什么是面向對象&#xff1f;主要的特征是什么&#xff1f;當然還有很多類似的題目&#xff0c;如果你說一下你對面向對象的理解&#xff0c;或者是你對比一下面向過程等等&#xff0c;諸如此類吧&#xff1f;如果我來回答這個問題&#xff0c;我會…

NOIP2014自測(晚自習兩節+上午兩節 共5個小時)

昨天剛剛考完試然后就翹晚自習跟今天上午兩節課的語文和英語做做noip2014的題目。然后去評測了一番。首先day1day2的t1基本都是模擬&#xff0c;一看就出思路那種&#xff0c;直接ac掉。代碼如下 day1t1&#xff1a;#include<iostream>#define maxn 209using namespace s…

您在eXo平臺上的第一個Juzu Portlet

菊珠是佛教的佛珠。 一句話&#xff0c;我相信您已經學到了什么&#xff0c;印象深刻嗎&#xff1f; 好的&#xff0c;我在這里不談論佛教。 Juzu還是一個用于快速開發Portlet&#xff08;以及即將推出的獨立應用程序&#xff09;的新框架。 您可以在Juzu網站上找到所需的所有…

Spring注入方式及注解配置

一&#xff1a;基于xml的DI&#xff08;Dependency Injection&#xff09; 注入類型&#xff1a; 定義學生Student實體類和小汽車Car實體類&#xff1a;進行封裝和生成ToString(),并自定義屬性Car Student 123456789101112131415161718192021222324252627282930313233343536373…

java 切面 不執行,解決springboot的aop切面不起作用問題(失效的排查)

檢查下springboot的啟動類是否開啟掃描springbootapplicationcomponentscan(basepackages {"com.zhangpu.springboot"})另外springboot默認開啟的enableaspectjautoproxy為true如果不放心可以增加&#xff1a;enableaspectjautoproxy(proxytargetclasstrue)第二種可…

修改readonly屬性的值

一般情況下&#xff0c;readonly屬性的值是無法修改的&#xff0c;但可以通過特殊方式修改。定義一個student的類&#xff0c;其中name屬性為readonly類型的變量 interface JFStudent : NSObjectproperty(nonatomic,copy,readonly) NSString *hisName;property(nonatomic,copy)…

VisualVM:通過SSH監視遠程JVM(是否為JMX)

VisualVM是用于監視JVM&#xff08;5.0&#xff09;的有關內存使用情況&#xff0c;線程&#xff0c;GC&#xff0c;MBeans等的出色工具。讓我們看看如何通過SSH使用它來監視&#xff08;甚至使用JMX對其進行采樣&#xff0c;對帶有JMX的遠程JVM進行監視&#xff09;它。 這篇文…

h5 php js實驗總結,H5學習_番外篇_PHP數據庫操作

1. 文件操作1.1 打開關閉文件fopen()resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )?fopen()函數將resource綁定到一個流或句柄。綁定之后&#xff0c;腳本就可以通過句柄與此資源交互;例1:以只讀方式打開一個位于本地服務…

ReactNative開發環境

此內容根據徐贏老師的文檔整理后寫處 原版地址&#xff1a;https://tuomaxu.gitbooks.io/reactnative/content/ ReactNative是跨平開發的解決方案&#xff0c;在開發平臺的選擇上&#xff0c;mac平臺和win平臺都可以。 所需要工具如下&#xff1a; 1&#xff0c;Nodejs環境 2&a…

Python自動化開發 - 字符串, 列表, 元組, 字典和和文件操作

一、字符串特性&#xff1a;字符串本身不可修改&#xff0c;除非字符串變量重新賦值。Python3中所有字符串都是Unicode字符串&#xff0c;支持中文。 >>> name "Jonathan" >>> name "Jonathan" "Ni" >>>print(na…

shiro java配置,InI 配置 - 跟我學 Apache Shiro_教程_Java開發社區

INI 配置之前章節我們已經接觸過一些 INI 配置規則了&#xff0c;如果大家使用過如 Spring 之類的 IoC/DI 容器的話&#xff0c;Shiro 提供的 INI 配置也是非常類似的&#xff0c;即可以理解為是一個 IoC/DI 容器&#xff0c;但是區別在于它從一個根對象 securityManager 開始。…

在Spring容器外部連接對象依賴項

有幾種有趣的方法可以設置在Spring容器外部實例化的對象的屬性和依賴關系。 用例首先&#xff0c;為什么我們需要在Spring容器之外進行依賴注入–我知道三個用例&#xff0c;其中我實例化了Spring容器之外的對象并需要注入依賴。 首先考慮使用Spring TaskExecutor執行一系列任…

前端學習路線匯總

https://123.w3cschool.cn/plk2fihttps://www.w3cschool.cn/nodejs/nodejs-global-object.htmlnode.js轉載于:https://www.cnblogs.com/sxz2008/p/7238773.html

MediaInfo源代碼分析 1:整體結構

博客地址&#xff1a;http://blog.csdn.net/leixiaohua1020/article/details/12016231 MediaInfo源代碼分析系列文章列表&#xff1a; MediaInfo源代碼分析 1&#xff1a;整體結構MediaInfo源代碼分析 2&#xff1a;API函數MediaInfo源代碼分析 3&#xff1a;Open()函數MediaI…

測試RESTful服務的客戶端

開發使用RESTful Web API的應用程序可能意味著開發服務器和客戶端。 為服務器端編寫集成測試可以像使用Arquillian來啟動服務器一樣容易&#xff0c;并且可以通過REST確保測試服務是否按預期工作。 問題是如何測試客戶端。 在本文中&#xff0c;我們將了解如何使用模擬來測試客…

linux mysql誤刪,linux下MySQL安裝與刪除?(Ubuntu)

1、MySQL安裝A)MySQL安裝&#xff1a; sudo apt-get install mysql-server mysql-clientB)啟動/停止MySQL服務&#xff1a;MySQL 在安裝以后&#xff0c;MySQL 就已經啟動&#xff1b;如果需要手動啟動或停止則如下操作&#xff1a;手動啟動服務&#xff1a; sudo start mysql手…

對多態的理解例子

public class A {public String show(D obj) {return ("A and D");}public String show(A obj) {return ("A and A");} }class B extends A{public String show(B obj){ //重載return ("B and B");}public String show(A obj){ //重寫show(A obj…

【Java每日一題】20170120

20170119問題解析請點擊今日問題下方的“【Java每日一題】20170120”查看&#xff08;問題解析在公眾號首發&#xff0c;公眾號ID&#xff1a;weknow619&#xff09; package Jan2017; import java.util.Arrays; import java.util.List; public class Ques0120 { publ…

使用NoSQL實現實體服務–第2部分:合同優先

現在該開始使用NoSQL項目對SOA實體服務進行編碼了&#xff0c;并且正如我所承諾的&#xff0c;我將從Web服務的合同開始。 看一下本系列的第1部分 。 這種從Web服務合同定義開始的技術是面向服務的體系結構實現的“合同優先”方法的核心&#xff0c;并具有許多技術優勢&#xf…