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);
//radio button composite << tab composite
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) {
// These settings will show up when Preference dialog
// opens up for the first time.
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));
...
}