javafx 项目_JavaFX,Jigsaw项目和JEP 253
javafx 項目
因此, Java 9可能會破壞您的代碼 ……
如果您的項目使用JavaFX,則這尤其可能,因為許多自定義和自制控件都需要使用內(nèi)部API。 借助Project Jigsaw,這些內(nèi)容將無法在Java 9中訪問。幸運的是, Oracle在幾天前宣布了 JEP 253 。 其目標(biāo):
為JavaFX UI控件和CSS功能定義公共API,這些公共API當(dāng)前僅可通過內(nèi)部API使用,因此由于模塊化而變得不可訪問。
JEP 253 – 2015年5月14日
讓我們看一下JavaFX,Jigsaw項目和JEP 253是如何交互的。
總覽
為了更好地了解內(nèi)部API在JavaFX中的作用,了解其控制體系結(jié)構(gòu)將很有幫助,因此我們將從此開始。 然后,我們將研究為什么在使用JavaFX時經(jīng)常使用內(nèi)部API。 這將有助于將新的JEP置于上下文中。
因為我熟悉它,所以我經(jīng)常以ControlsFX為例。 我假設(shè)類似的庫(例如JFXtras )以及其他自定義JavaFX的項目都處于相同的情況。
JavaFX控制架構(gòu)
模型視圖控制器
JavaFX控件是根據(jù)model-view-controller實現(xiàn)的 。 無需贅述,讓我們快速了解一下如何完成。 (有關(guān)詳細信息,請參見GuiGarage 。)
所有正式控件都擴展了抽象類Control 。 這是MVC的模型。
該控件定義一個skinProperty ,其中包含一個Skin實現(xiàn)。 它可視化控件的當(dāng)前狀態(tài),即它是MVC的視圖。 默認(rèn)情況下,它還負(fù)責(zé)捕獲和執(zhí)行用戶交互,這在MVC中是控制器的任務(wù)。
皮膚通常是通過擴展BehaviorSkinBase實現(xiàn)的。 它創(chuàng)建了BehaviorBase的實現(xiàn),將所有用戶交互委托給該BehaviorBase的實現(xiàn),并相應(yīng)地更新了模型。 因此,這里有MVC的控制器。
按鍵綁定
還值得注意的是控件如何解決用戶輸入。 為了將動作鏈接到輸入(例如,“ CTRL +鼠標(biāo)單擊”中的“在后臺打開新選項卡”),它們創(chuàng)建了KeyBindings列表。 然后將輸入事件與所有創(chuàng)建的綁定進行比較,并調(diào)用正確的操作。
由Flosweb在CC-BY-SA下發(fā)布 -我添加了拼圖效果。
JavaFX中的內(nèi)部API
使用JavaFX時,通常依賴于內(nèi)部API。 這樣做是為了創(chuàng)建新控件,調(diào)整現(xiàn)有控件或修復(fù)錯誤。
創(chuàng)建新控件
雖然Control , Skin甚至SkinBase都是公共API,但經(jīng)常使用的BehaviorSkinBase和BehaviorBase不是。 使用拼圖項目,將無法訪問它們。
不過,該API的使用率很高。 ControlsFX包含大約二十個控件,其中大約一半需要這些類之一的實現(xiàn)。
同樣,鍵KeyBindings沒有發(fā)布,因此創(chuàng)建鍵KeyBindings來管理用戶交互會增加另一個有問題的依賴性。
調(diào)整現(xiàn)有控件
自定義現(xiàn)有控件通常會更改可視化效果或調(diào)整某些用戶交互的行為。
對于前者,簡單地擴展和修改現(xiàn)有的外觀通常是最容易的。 不幸的是,現(xiàn)有控件的所有外觀都位于com.sun.javafx.scene.control.skin 。 當(dāng)它們變得不可訪問時,許多自定義控件將不再編譯。
要更改控件對用戶交互的React,必須干預(yù)BehaviorBase定義的BehaviorBase 。 這類似于創(chuàng)建新控件,通常通過擴展BehaviorSkinBase和BehaviorBase并創(chuàng)建新的KeyBindings 。
通過CSS設(shè)置控件的樣式
在JavaFX中,可以實現(xiàn)控件,以便可以通過CSS設(shè)置樣式。 所有官方控件都具有此功能,其他一些控件也由其他項目提供。
設(shè)置控件樣式的中心步驟是將屬性的文本表示形式從CSS文件轉(zhuǎn)換為Number , Paint ,enum…的實例,以便可以將它們分配給屬性。 為了確保統(tǒng)一,高質(zhì)量的轉(zhuǎn)換,JavaFX為此提供了一個API。 不幸的是,它位于com.sun.javafx.css.converters 。
高級樣式要求必須在StyleManager幫助下實現(xiàn),您猜想它也沒有發(fā)布。
解決錯誤
JavaFX相對來說還很年輕,但仍然包含一些很難接觸的錯誤。 通常,唯一的解決方法是侵入控件的內(nèi)部工作原理,從而使用私有API。 (此類情況的示例可以在OpenJFX郵件列表中找到,例如RobertKrüger , Stefan Fuchs和Tom Schindl在這些郵件中。)
這些變通辦法將在Java 9中失敗。由于似乎所有錯誤均已修復(fù),因此它們不必要變得不必要,因此可以理解以下問題:
當(dāng)然,從理論上講,如果所有[那些bug]都已在[Java] 9中得到了修復(fù),那我很好,但是如果有一段時間將其中的一半修復(fù)在9中,而另一半只能在8,我該如何處理我的產(chǎn)品?
羅伯特·克魯格– 2015年4月9日
杰普253
我們已經(jīng)了解了為什么在使用JavaFX時普遍使用內(nèi)部API。 那么, JEP 253如何解決這個問題?
(除非另有說明,否則本節(jié)中的所有引號均取自JEP。)
目標(biāo),非目標(biāo)和成功指標(biāo)
該提案恰好解決了到目前為止所描述的問題。 而且它認(rèn)識到“在很多情況下,要獲得理想的結(jié)果,開發(fā)人員別無選擇,只能使用這些內(nèi)部API”。 因此,“此JEP的目標(biāo)是為內(nèi)部API當(dāng)前提供的功能定義公共API”。
(請注意,當(dāng)開發(fā)人員將其代碼從內(nèi)部移動并且現(xiàn)在無法訪問新的公共API時,這仍然會帶來編譯錯誤。)
同時,該JEP既不計劃對現(xiàn)有已發(fā)布的代碼進行任何更改,也不進行任何改進:“不受模塊化影響的所有其他現(xiàn)有API都將保持不變。”
定義了兩個成功指標(biāo):
- “依賴JavaFX內(nèi)部API的項目,尤其是Scene Builder,ControlsFX和JFXtras,在更新到新的API之后仍可以繼續(xù)工作,而不會失去功能?!?
 - “最終,如果所有工作都按計劃進行,那么第三方控件應(yīng)該是可構(gòu)建的,而不依賴于內(nèi)部API。”
 
三個項目
JEP分為三個項目:
項目一:使UI控件外觀成為公共API
 現(xiàn)有控件的外觀將從com.sun.javafx.scene.control.skin移至 
 javafx.scene.control.skin 。 這將使它們成為已發(fā)布的API。 (請注意,這不包括行為類。) 
項目二:改進對輸入映射的支持
行為將通過輸入映射來定義。 這允許在運行時更改控件的行為,而無需擴展任何特定(且未發(fā)布)的類。
項目三:審查并公開相關(guān)CSS API
com.sun.*軟件包中當(dāng)前可用CSS API將進行審查和發(fā)布。 該提案將更加詳細,并描述每個項目的當(dāng)前狀態(tài)以及一些風(fēng)險和假設(shè)。
這些項目解決了上述四個用例中的三個。 可以合理地假設(shè)可以滿足這些要求,并且在Java 9中,即使無法訪問內(nèi)部API,也可以正確地創(chuàng)建,調(diào)整和皮膚控件。
如何解決錯誤? 至少其中一些似乎可以用相同的工具解決(例如,擴展現(xiàn)有的皮膚)。 但是我不能說這是否對所有人都適用,以及沒有解決方法留下來的重要性有多重要。
時間表
如果您想試用新的API,則必須耐心等待一段時間。 JFX 253的所有者,JavaFX UI控件團隊的Oracle技術(shù)負(fù)責(zé)人喬納森·吉爾斯(Jonathan Giles)在推文中說,“他可能在幾個月內(nèi)不會合并到存儲庫中……”。
另一方面,由于Java 9的功能完整性計劃于12月發(fā)布 ,因此它必須在接下來的七個月內(nèi)可用。
反射
我們已經(jīng)看到,使用JavaFX常常需要使用私有API。 這發(fā)生在三個截然不同的區(qū)域:
- 根據(jù)控件體系結(jié)構(gòu)(MVC)創(chuàng)建新控件。
 - 通過擴展其外觀或更改鍵綁定來調(diào)整現(xiàn)有控件。
 - 通過CSS設(shè)置控件的樣式。
 - 解決錯誤。
 
JEP 253分為三個項目,分別針對前三個領(lǐng)域。 (對于我來說)尚不清楚它們是否足以僅使用公共API來解決錯誤。
翻譯自: https://www.javacodegeeks.com/2015/05/javafx-project-jigsaw-and-jep-253.html
javafx 項目
總結(jié)
以上是生活随笔為你收集整理的javafx 项目_JavaFX,Jigsaw项目和JEP 253的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: ddos是什么原理及怎样防御(ddos是
 - 下一篇: java循坏_Java的坏功能是什么