javafx 自定义控件_JavaFX技巧10:自定义复合控件
javafx 自定義控件
用JavaFX編寫自定義控件是一個(gè)簡單直接的過程。 需要一個(gè)控件類來控制控件的狀態(tài)(因此命名)。 外觀需要控件的外觀。 而且通常不是用于自定義外觀CSS文件。
控件的一種常見方法是將其正在使用的節(jié)點(diǎn)隱藏在其外觀類中。 例如, TextField控件使用javafx.scene.text.Text的兩個(gè)實(shí)例。 一個(gè)用于常規(guī)文本,一個(gè)用于提示文本。 這些節(jié)點(diǎn)不能通過TextField API訪問。 如果要獲取對它們的引用,則需要在Node上調(diào)用lookup(String)方法。 到目前為止,一切都很好。 實(shí)際上,很難想到您實(shí)際上需要訪問Text節(jié)點(diǎn)的用例。
但…
如果您開發(fā)復(fù)雜的自定義控件,那就完全不一樣了。 FlexGanttFX Gantt圖表框架就是一個(gè)示例。 GanttChart控件由許多其他復(fù)雜控件組成,并且遵循“ 關(guān)注點(diǎn)分離 ”的原則,這些控件包含所有與它們正常工作相關(guān)的方法和屬性。 如果這些控件隱藏在甘特圖的外觀內(nèi),則將無法訪問它們,并且甘特圖控件將需要實(shí)現(xiàn)大量的委托方法。 這將完全使甘特圖API混亂。 因此, GanttChart類確實(shí)為其子控件提供了訪問器方法,甚至提供了用于創(chuàng)建子節(jié)點(diǎn)的工廠方法。
例
以下屏幕快照顯示了我當(dāng)前正在為ControlsFX項(xiàng)目使用的新控件 。 我稱之為ListSelectionView ,它具有兩個(gè)ListView實(shí)例。 用戶可以通過雙擊項(xiàng)目或使用中間的按鈕將項(xiàng)目從一個(gè)列表移動(dòng)到另一個(gè)列表。
列表視圖是復(fù)雜的控件。 他們有自己的數(shù)據(jù)和選擇模型,他們自己的單元工廠,他們觸發(fā)事件等等。 所有這些事情我們都可能想要自定義或聆聽。 如果視圖隱藏在皮膚類中,則很難做。 解決方案是通過受保護(hù)的工廠方法在控件類內(nèi)部創(chuàng)建列表視圖,并提供訪問器方法。
以下代碼片段顯示了可以使用的模式:
public class ListSelectionView<T> extends Control {private ListView<T> sourceListView;private ListView<T> targetListView;public ListSelectionView() {sourceListView = createSourceListView();targetListView = createTargetListView();}protected ListView<T> createSourceListView() {return new ListView<>();}protected ListView<T> createTargetListView() {return new ListView<>();}public final ListView<T> getSourceListView() {return sourceListView;}public final ListView<T> getTargetListView() {return targetListView;} }工廠方法可用于創(chuàng)建標(biāo)準(zhǔn)ListView實(shí)例并在此處配置它們,或者返回已經(jīng)存在的ListView專業(yè)化實(shí)例。 一家名為ACME的公司可能已經(jīng)提供了一套標(biāo)準(zhǔn)的控件(實(shí)現(xiàn)了公司的營銷理念)。 然后,工廠方法可能會(huì)返回一個(gè)名為ACMEListView的控件。
翻譯自: https://www.javacodegeeks.com/2014/07/javafx-tip-10-custom-composite-controls.html
javafx 自定義控件
總結(jié)
以上是生活随笔為你收集整理的javafx 自定义控件_JavaFX技巧10:自定义复合控件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1秒等于多少ms 1秒所对应的ms
- 下一篇: java与java ee_RxJava