2012-09-12 155 views
6

我對WPF和JavaFX 2.0有了很多的經驗。 我即將將Silverlight項目移至JavaFX 2.0。 兩個Apress書籍和幾個線程無法回答我的問題(也許我沒有看到或理解答案,因爲我的WPF影響了期望)。JavaFX 2.0風格/模板現有控件

我需要的是一個帶有RadioButton功能的控件,但卻是一個完全不同的用戶界面。 我的RadioButton在文本下有一個文本,一個圖像,沒有按鈕,一條線(矩形)。 如果未選中RadioButton,則文本和圖像是透明的,圖像被灰度化,矩形不可見。 如果選中,文本和圖像不透明,圖像被着色並且矩形變爲可見(所有通過動畫更改)。

我知道如何爲現有的JavaFX 2.0控件創建皮膚,但我不知道如何以這種方式對RadioButton進行樣式/蒙皮。

在WPF中,我簡單地爲我的RadioButton風格創建一個新模板......正如我所提到的,也許這些WPF影響了對JavaFX 2.0的期望是我的障礙。

謝謝...

編輯:

好像它是不可能創造現有的控制另一個模板(?): JavaFX 2.0 render controls inside control

那麼,什麼將是實施的最佳方式我的RadioButton? 我煩惱ToggleGroup ...

+0

你可以插入選定和未選中狀態的圖像嗎? – jewelsea

+0

可能,但不是必需的,因爲如果未選中圖像將是透明和灰度。 – thinkU

+0

對不起,我的意思是按鈕狀態的意思是在問題中的位置圖像,以便更容易地制定出更直接解決您的案例的答案。 – jewelsea

回答

5

JavaFX控件的樣式或模板有很多種方法。

  1. 預構建的JavaFX控件可通過css進行設置。

  2. 預構建的JavaFX控件也可以被分類以修改它們的功能和外觀。 example是IntField,它創建一個自定義的TextField,只編輯整數。

  3. 通常,您可以通過在佈局PaneGroup中放置一堆現有控件來構建自定義組件。通過參數化構建混合組件的方法或類,可以有效地通過代碼模板自定義組件構建。下面是使用這種方法構建的digital and analogue clock components的示例(以及可通過CSS調整樣式)。

  4. 您還可以使用introduction to fxml document中的方法通過不同的fxml文件管理自定義組件的佈局。可以使用模板語言(如velocity)生成fxml,或者可以爲不同的佈局編寫幾個不同的靜態fxml文件。靜態或生成的fxml也可以從web服務器動態提供,如果需要的話,就像動態生成的html站點一樣。

  5. 另一種構建自定義控件的方法與JavaFX團隊完成它的方式相同(通過爲控件創建Skin和Behavior類)。從JavaFX 2.2開始(甚至在將來的JavaFX版本中),這對於庫創建者來說是最合適的,例如那些在jfxtras上工作或直接對JavaFX項目的open source control repository作出貢獻的人。

  6. 還要注意的是,在CSS中,你可以指定一個控制皮膚類,例如單選按鈕具有以下的css:

 
    .radio-button { 
     -fx-skin: "com.sun.javafx.scene.control.skin.RadioButtonSkin"; 
    } 

所以,一個方式來定製的單選按鈕看起來你正在考慮的是:

  1. 抓住從開源JavaFX的庫我在前面鏈接的RadioButtonSkin類源代碼的副本。
  2. 將其複製到新的類名(例如LinedRadioButtonSkin)。
  3. 修改它得到你想要的樣子。
  4. 爲您的項目創建一個自定義css樣式表。
  5. 在自定義CSS樣式表中設置.radio-button類的-fx-skin屬性以使用新的LinedRadioButtonSkin類。

只要你的新皮膚的正確實施和有線到現有ButtonBehaviour類相似,如何在現有RadioButtonSkin類的工作,那麼你就應該自動獲得同樣的行爲作爲現有無線電新的皮膚基於單選按鈕鈕釦。例如,該按鈕將響應鼠標點擊,鍵盤加速器,觸摸事件,與ToggleGroups等進行交互,與現有的RadioButtonSkin完全相同,並可使用現有的RadioButton api進行訪問。也就是說,該按鈕保留了RadioButton的感覺(行爲),但可以通過使用不同的內部組件,佈局和CSS樣式完全不同。

如果您決定使用自定義皮膚路徑並需要此過程的幫助,請考慮聯繫jfxtras團隊的成員並將您的新皮膚捐贈給jfxtras項目。

買者

中的JavaFX 2.2皮膚和行爲類是私有實現的API,沒有公開支持的API,併爲他們過渡到公共API(定爲JavaFX的下一個主要版本,今後將改變 - JavaFX/JDK 8) - 所以如果你今天使用這些,請謹慎行事。一旦他們過渡到公共API,我希望你會看到更多的信息和教程,如何使用這些類創建自己的控件。

包名稱和api方法將作爲api從Skin和Behavior從內部私有實現轉換爲public api構建自己的控件。例如com.sun.javafx.scene.control.behavior.BehaviorBase可能會變成javafx.scene.control.behavior.Behavior,因此如果您創建了一個擴展BehaviorBase的類,它將不會針對新版本的JavaFX運行,直到您修改類的源以引用新名稱和api並重新編譯它。

出於同樣的原因,直到API公開和最終纔會有關於此主題的優秀書籍,因爲任何示例代碼包含的針對私人api寫入的書籍將在api製作完成後立即過期公開的,並且既不會針對公共API進行編譯,也不會針對更新版本的JavaFX進行編譯。

+0

非常感謝Jewelsea!所有我想要的信息和我錯過了兩本書。 (6)似乎像我使用的「WPF模板」方式。我會嘗試(5)和(6)...已經興奮。 P.S .:你能推薦一本好書嗎? P.P.S:我不明白爲什麼要謹慎使用私有實現API? – thinkU

+0

更新告誡信息以回答您的問題。 – jewelsea