這個答案只是要諮詢,有沒有真正的正確或錯誤的答案在這裏。如果你不同意這個建議,或者這個建議不適用於你的情況,你可以忽略它。
對不起,但問題是開放式的,可能的答案很複雜。
我正在考慮繼承Path或Canvas以用作我的控件。
不要。 Favor composition over inheritance。擁有一個實現控件功能接口的控件類,並且無論使用何種UI技術都可以工作。爲控件類提供對控件的UI表示的外觀類的引用。外觀將指定如何呈現給定狀態下的控件(從相關控制對象獲取控件狀態)。此外,皮膚將響應用戶操作,例如鼠標按下並指示控件根據鼠標按鍵改變其狀態 - 因此皮膚知道它與哪個控件相關聯,反之亦然。在控件類中有可綁定屬性來表示控件狀態。
一個簡單的例子就是這個tic-tac-toe遊戲實現的Square and SquareSkin。
例如,想象複選框控件。控件的可綁定屬性可能是一個狀態爲(checked,unchecked,undetermined)的枚舉。皮膚可能會將複選框顯示爲帶勾號的方框,以表示已檢查的狀態。或者,也許皮膚會渲染帶有X的圓邊。皮膚可以使用任何想要呈現複選框的技術,例如,一個畫布或一組節點。皮膚爲鼠標點擊,按鍵等註冊監聽器,並通知複選框控件設置其檢查狀態。它還有一個關於檢查狀態的監聽器,並將根據該狀態選擇是否呈現檢查記號。
關鍵是複選框的API接口只是一個帶有檢查狀態的複選框控件類。用戶界面的處理方式從複選框API抽象出來,因此您可以在不更改任何其他代碼的情況下交換UI實現的內容和外觀。
子類化路徑與子類化Canvas完全不同。對於訂閱的情況,我絕對贊成將Shape節點(或區域)與Canvas相對應。使用節點,你會自動獲得一個非常豐富的UI渲染和事件模型,可以綁定的屬性集和和繪畫框架,這些都不會用Canvas獲得。如果您不使用節點,您最終可能會嘗試以某種次標準方式重新創建和構建Node功能的某些部分。 Canvas非常適用於從其他框架移植2D遊戲或圖形引擎或構建像粒子系統等像素操縱器的東西,但以其他方式避免它。
考慮爲控制皮膚使用佈局窗格,例如,一個StackPane或類似的東西。佈局窗格是容器,因此您可以將內容放入其中,並使用聚合和合成來構建更復雜的控件。佈局窗格還可以幫助您佈置節點。
任何將類似於窗格的區域劃分的子類都可以通過CSS設置爲任意形狀和顏色。這實際上是JavaFX中的內置複選框(和其他控件)的工作原理。複選框是兩個區域的堆疊,一個是盒子,另一個是支票。兩者都採用CSS樣式 - 爲JavaFX搜索.check-box in the modena.css樣式表。請注意,如何使用-fx-shape
通過指定svg路徑(您可以在svg編輯器(如inkscape)中創建)來獲取刻度線形狀。還要注意背景分層是如何用來獲得像聚焦環這樣的東西的。使用CSS風格的優點是,您可以在不觸及Java代碼的情況下在風格上更改控件。
所以使用SkinBase和BehaviourBase是不是一種選擇
即使你已經決定不使用這些基類(我認爲這是一個不錯的決定,即使你是隻針對Java的8+) ,我認爲值得研究JavaFX source中的控件設計。研究按鈕或複選框,這樣你就可以看到專家如何做這些事情。另外請注意,這樣的實現可能對您的應用程序過度,因爲您沒有構建可重用的控制庫。你只需要一些能在你的應用程序範圍內工作的很好的東西(這就是我不一定建議爲所有應用程序擴展SkinBase的原因)。
作爲最小read up on Controls on the open-jfx wiki。
這是需要使用JDK 7
IMO,沒有開發新的JavaFX應用程序爲目標Java 7中有許多錯誤修正爲Java 8,再加上新的和有用的多點功能添加。通常,Java 7是JavaFX應用程序的次優目標平臺。如果您將應用程序打包爲self-contained application,那麼您可以將任何Java平臺隨應用程序一起發佈,因此目標平臺無關緊要。
諸如WebStart或瀏覽器嵌入式應用程序(小程序)等IMO部署技術可以在系統上使用預先安裝的Java運行時,這是傳統的部署模式,這對於大多數應用程序來說是最好的避免。
不過,可能會出現這樣的情況:由於受控制之外的某些限制,您絕對必須擁有Java 7,所以我想只是對您的情況進行仔細評估。如果你有這樣的約束,並且必須建立在一個穩定的,傳統的UI工具包上,這個工具包可以和多年前發佈的運行時間一起工作,你總是可以使用Swing。
thx爲詳細答案。非常好的建議。但由於我不能使用jdk 8(大學不允許),所以我決定使用swing。但無論如何它是一個很好的答案;) – Tobi 2014-11-07 20:56:10
這個Control + Skin事件對於MVC/MVP/MV *來說只是一個奇怪的名字。 – cubuspl42 2016-09-09 14:44:14