2013-07-25 179 views
2

在許多情況下,JavaFX需要使用擴展現有類的類進行定製。我嘗試了這種方法,例如爲NumberAxis類添加一個方法,該方法可以使軸的標籤旋轉。 但我得到了「NumberAxis聲明爲final,無法擴展」的編譯器錯誤。我想知道擴展班的人是怎麼做的?他們有權訪問javafx的源代碼,修改它以使某些類不是最終的,並重新編譯它? (聽起來很棘手!)在Java FX中擴展類?

回答

4

在JavaFX框架中製作大量類最終是由框架開發人員做出的有意決定。要了解它完成的原因,請參閱Making Color Final proposal。這只是一個例子,還有其他原因。我認爲在Swing框架中使用子類化的經驗是,它引發了JavaFX設計人員想要避免的錯誤和維護問題,所以很多事情都是最終的。

還有其他擴展功能的方法,而不是直接子類。一些替代爲循環例如:

  1. 聚合:包括NumberAxis作爲新的類(例如NumberAxisWithRotatableText)它增加了一個存取以獲得底層NumberAxis節點並執行旋轉的方法的一個成員(例如,通過如下所述的查找)。
  2. 組成:例如擴展窗格,添加NumberAxis,禁用軸上的標準文本繪圖並根據需要自行添加旋轉標籤。
  3. css樣式表:例如使用選擇器來查找NumberAxis中的文本和-fx-rotate屬性來旋轉它。
  4. 節點查找:使用node.lookup來獲取底層文本節點,並通過API應用旋轉。
  5. 皮膚:所有控件都有一個skin類附加它們,用自定義類替換默認的皮膚類。
  6. 子類的替代類:子類抽象ValueAxis類而不是最終的NumberAxis類。

JavaFX的源代碼是availablebuild instructions。但是,我不建議竊取源代碼的個人副本以刪除最終構造,除非您還將其作爲JavaFX系統的接受補丁提交,以便確保您的應用不會因標準JavaFX安裝而中斷。

如果你真的認爲給定的類是一個好主意是可分類的,那麼log a change request。有時候,JavaFX開發人員過分熱衷於做最後的決定,而不是最終決定。 NumberAxis可能屬於該類別。