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