JFace 外掛程式提供一組織架構,以實作精靈、喜好設定頁面和對話框。這些對話框的實作方式遵循一個共用的型樣。 頁面或對話框的內容是藉由實作 createContents 方法來定義的,這個方法可建立代表頁面內容的 SWT 控制項。這個方法也應該為任何感興趣的事件新增接聽器。該頁面負責建立及傳回頁面中所有控制項之母項的組合。 下列片段顯示重點:
protected Control createContents(Composite parent){ ... //composite_textField << parent Composite composite_textField = createComposite(parent, 2); Label label_textField = createLabel(composite_textField, MessageUtil.getString("Text_Field")); textField = createTextField(composite_textField); pushButton_textField = createPushButton(composite_textField, MessageUtil.getString("Change")); //composite_tab << parent Composite composite_tab = createComposite(parent, 2); Label label1 = createLabel(composite_tab, MessageUtil.getString("Radio_Button_Options")); // tabForward(composite_tab); //圓鈕組合 << 標示組合 Composite composite_radioButton = createComposite(composite_tab, 1); radioButton1 = createRadioButton(composite_radioButton, MessageUtil.getString("Radio_button_1")); radioButton2 = createRadioButton(composite_radioButton, MessageUtil.getString("Radio_button_2")); radioButton3 = createRadioButton(composite_radioButton, MessageUtil.getString("Radio_button_3")); //composite_tab2 << parent Composite composite_tab2 = createComposite(parent, 2); Label label2 = createLabel(composite_tab2, MessageUtil.getString("Check_Box_Options")); //$NON-NLS-1$ // tabForward(composite_tab2); //composite_checkBox << composite_tab2 Composite composite_checkBox = createComposite(composite_tab2, 1); checkBox1 = createCheckBox(composite_checkBox, MessageUtil.getString("Check_box_1")); checkBox2 = createCheckBox(composite_checkBox, MessageUtil.getString("Check_box_2")); checkBox3 = createCheckBox(composite_checkBox, MessageUtil.getString("Check_box_3")); initializeValues(); return new Composite(parent, SWT.NULL); }
這個方法中大部分程式碼與建立及佈置控制項有關,所以在此不做分析。這裡 所談的是對應頁面的外觀:
喜好設定頁面的另一個主要責任是反應 performOk 訊息。一般而言,這個方 法會更新及儲存使用者喜好設定,必要時更新其他任何外掛程式物件來反映喜好設定 中的變更。performDefaults 方法是用來當使用者按下還原預設值按鈕時, 將喜好設定還原至它們的預設狀態。
如果在使用者選取套用時,您具有其他處理程序, 您可以置換 performApply。預設實作將呼叫 performOk。
喜好設定頁面將置換 doGetPreferenceStore() 方法以傳回儲存其值的喜好 設定儲存庫。
喜好設定儲存庫是存取及儲存喜好設定值,和將它存放在外掛程式類別中的簡便機制。 它們提供外掛程式層次的存取權,給使用執行時期喜好設定服務來實際儲存的喜好設定。 AbstractUIPlugin 定義了一個廣泛的外掛程式喜好設定儲存庫,它是在外掛程式生命期限內所維護的。 您的外掛程式可新增項目到喜好設定儲存庫,並在使用者變更您喜好設定頁面中的設定時更新其值。 因為喜好設定儲存庫使用平台喜好設定服務,這些服務會負責將喜好設定值儲存在適當的範圍和位置,並使用適當的機制來初值設定喜好設定儲存庫。
ReadmePreferencePage 中的下列程式碼可取得 ReadmePlugin 的喜 好設定儲存庫。
protected IPreferenceStore doGetPreferenceStore() { return ReadmePlugin.getDefault().getPreferenceStore(); }
由於 ReadmePlugin 延伸 AbstractUIPlugin 類別,所以會自動繼承喜好設定儲存庫,這個喜好設定儲存庫是利用平台喜好設定服務來初值設定的。ReadmePlugin 唯一需要做的是實作 將喜好設定控制項初值設定回其預設值的方法。 第一次顯示喜好設定頁面或使用者按下喜好設定頁面中的預設值按鈕時,會使用這些值。
protected void initializeDefaultPreferences(IPreferenceStore store) { // 第一次開啟「喜好設定」對話框時, // 這些設定將顯示出來。 store.setDefault(IReadmeConstants.PRE_CHECK1, true); store.setDefault(IReadmeConstants.PRE_CHECK2, true); store.setDefault(IReadmeConstants.PRE_CHECK3, false); store.setDefault(IReadmeConstants.PRE_RADIO_CHOICE, 2); store.setDefault(IReadmeConstants.PRE_TEXT, MessageUtil.getString("Default_text")); //$NON-NLS-1$ }
附註: 如果沒有喜好設定儲存在外掛程式的任何位置,該外掛程式會取得一個空的喜好設定儲存庫。
一旦建立外掛程式喜好設定儲存庫與喜好設定頁面的關聯性,您可以實作用於擷取及儲存喜好設定的邏輯。
喜好設定頁面負責利用喜好設定儲存庫中的喜好設定來初值設定它們控制項的值, 這個程序類似從對話框設定初值設定對話框控制項值。ReadmePreferencePage 在單一方法 initializeValues 中初值設定 其所有控制項,該方法需要從它的 createContents 方法呼叫。
private void initializeValues() { IPreferenceStore store = getPreferenceStore(); checkBox1.setSelection(store.getBoolean(IReadmeConstants.PRE_CHECK1)); checkBox2.setSelection(store.getBoolean(IReadmeConstants.PRE_CHECK2)); checkBox3.setSelection(store.getBoolean(IReadmeConstants.PRE_CHECK3)); ... }
當按下確定(或套用)按鈕,喜好設定頁面上控制項現行值應存回喜 好設定儲存庫中。ReadmePreferencePage 在個別的方法 storeValues 中實作這個邏輯。
private void storeValues() { IPreferenceStore store = getPreferenceStore(); store.setValue(IReadmeConstants.PRE_CHECK1, checkBox1.getSelection()); store.setValue(IReadmeConstants.PRE_CHECK2, checkBox2.getSelection()); store.setValue(IReadmeConstants.PRE_CHECK3, checkBox3.getSelection()); ... }
當使用者按下預設值按鈕,平台便會將所有喜好設定儲存值還原成外掛程式 類別中指定的預設值。不過,您的喜好設定頁面負責在喜好設定頁面的控制項中反映 這些預設值。ReadmePreferencePage 在 initializeDefaults 中實 作這個邏輯。
private void initializeDefaults() { IPreferenceStore store = getPreferenceStore(); checkBox1.setSelection(store.getDefaultBoolean(IReadmeConstants.PRE_CHECK1)); checkBox2.setSelection(store.getDefaultBoolean(IReadmeConstants.PRE_CHECK2)); checkBox3.setSelection(store.getDefaultBoolean(IReadmeConstants.PRE_CHECK3)); ... }