3.5 首 选 项
Eclipse中的首选项是整个Eclipse的配置中心,插件的主要配置都在这个地方完成。首选项也是可以定制的,也就是说我们可以将我们自己的首选项页面加入这个首选项对话框中。
Eclipse中提供了一个首选项开发的向导,我们可以通过这个向导生成的代码来理解首选项的开发。
这里重点讲解一下首选项的配置保存。org.eclipse.core.runtime.preferences包提供了用于访问首选项的类。与上面讲解的对话框配置保存一样,插件首选项也是以键值对的形式保存的,其中键描述首选项的名称,而值必须是几种不同类型中的一种(boolean、double、float、int、long 或 string)。
通过AbstractUIPlugin的getPreferenceStore方法可以取得首选项配置服务。
读取:
IPreferenceStore store = getPreferenceStore();
checkBox1.setSelection(store.getBoolean("isLoad"));
保存:
IPreferenceStore store = getPreferenceStore();
store.setValue("isLoad", checkBox1.getSelection());
首选项页都直接或者间接地从PreferencePage类继承,在初始化的时候需要首先调用setPreferenceStore方法为此页设定一个首选项配置服务,当【应用】、【取消】、【默认值】或【确定】按钮被单击的时候,performApply、performCancel、performDefaults、performOk方法将会分别被调用,我们就可以在这些方法中保存配置,而在createContents中构造控件的时候去加载这些参数。
如果我们要自己编写首选项配置界面的话,不仅要处理页面布局,还要自己处理属性的保存、加载,幸好Eclipse为我们提供了一个更好用的配置界面基类FieldEditorPreferencePage。FieldEditorPreferencePage 将每一个配置项看成一个字段编辑器,整个页面就是由不同类型的字段编辑器组成的。FieldEditorPreferencePage提供了常见字段编辑器:
l BooleanFieldEditor——布尔字段编辑器。
l IntegerFieldEditor——整数编辑器,可调用setValidRange来限制整数的范围。
l StringFieldEditor——文本编辑器,可以调用setEmptyStringAllowed来限制是否能为空。
l RadioGroupFieldEditor——单选按钮组编辑器。
l ColorFieldEditor——颜色编辑器。
l FontFieldEditor——字体编辑器。
l DirectoryFieldEditor——文件夹编辑器。
l FileFieldEditor——文件编辑器。
l ScaleFieldEditor——步进范围整数编辑器。
各个插件还可以从FieldEditor继承来编写符合自己个性化要求的字段编辑器,图3.9是一个字段编辑器页面的典型应用。
Eclipse的插件开发中“首选项向导”生成的就是基于FieldEditorPreferencePage的代码,可以仔细研究一下。

图3.9 字段编辑器示例
首先看SamplePreferencePage.java:
public class SamplePreferencePage extends FieldEditorPreferencePage implements
IWorkbenchPreferencePage
{
public SamplePreferencePage()
{
super(GRID);
setPreferenceStore(Activator.getDefault().getPreferenceStore());
}
public void createFieldEditors()
{
addField(new DirectoryFieldEditor(PreferenceConstants.P_PATH,
"&Directory preference:", getFieldEditorParent()));
addField(new BooleanFieldEditor(PreferenceConstants.P_BOOLEAN,
"&An example of a boolean preference", getFieldEditorParent()));
addField(new RadioGroupFieldEditor(PreferenceConstants.P_CHOICE,
"An example of a multiple-choice preference", 1,
new String[][] { { "&Choice 1", "choice1" },
{ "C&hoice 2", "choice2" } }, getFieldEditorParent()));
addField(new StringFieldEditor(PreferenceConstants.P_STRING,
"A &text preference:", getFieldEditorParent()));
}
public void init(IWorkbench workbench)
{
}
}
我们需要做的只是在构造函数中给它传递一个首选项配置存取接口并在createFieldEditors方法中调用addField方法添加各种各样的编辑器,其他的事情根本无需我们处理。图3.10是运行效果图。

图3.10 示例首选项页
插件代码还生成了一个初始化类,用来设置页面的默认值:
public class PreferenceInitializer extends AbstractPreferenceInitializer
{
public void initializeDefaultPreferences()
{
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
store.setDefault(PreferenceConstants.P_BOOLEAN, true);
store.setDefault(PreferenceConstants.P_CHOICE, "choice2");
store.setDefault(PreferenceConstants.P_STRING, "Default value");
}
}
如果您的首选项页面非常复杂的话,可能只使用addField添加简单的编辑器解决不了问题,您可以直接使用SWT代码来对首选项页进行更精细化、更复杂的调整。







