现在正在做一个rcp软件,刚刚做好了Preferences,总结一下。此方法也适用eclipse plugin。在作ipass的时候,没有发现有这么简便的方法。
以一个配置密码策略的页面为例:
public class PreferencePassPolicyPage extends FieldEditorPreferencePage
implements IWorkbenchPreferencePage {
public static final String PASSWORD_CHARS = "passgate.password.chars";
public static final String ALPHABETIC = "alphabetic";
public static final String ALPHANUMERIC = "alphanumeric";
public static final String NUMERIC = "numeric";
public static final String PASSWORD_CASE = "passgate.password.case";
public static final String UPPER = "uppercase";
public static final String LOWER = "lowercase";
public static final String MIXED = "mixed";
public static final String PASSWORD_LENGTH = "passgate.password.length";
public PreferencePassPolicyPage() {
super(GRID);
setTitle("Password Policy");
setImageDescriptor(ImageShop.getDescriptor("category_obj"));
setPreferenceStore(PwdgatePlugin.getDefault().getPreferenceStore());
}
public void init(IWorkbench workbench) {
}
protected void createFieldEditors() {
// characters
String[][] choose = new String[][] {
new String[] { "Use alphabetic only", ALPHABETIC },
new String[] { "Use numberic only", NUMERIC },
new String[] { "Use alphanumeric only", ALPHANUMERIC } };
FieldEditor charcterEditor = new RadioGroupFieldEditor(PASSWORD_CHARS,
"Characters", 1, choose, getFieldEditorParent(), true);
addField(charcterEditor);
// case
choose = new String[][] { new String[] { "Lower case", LOWER },
new String[] { "Upper case", UPPER },
new String[] { "Mixed", MIXED } };
FieldEditor caseEditor = new RadioGroupFieldEditor(PASSWORD_CASE,
"Case", 1, choose, getFieldEditorParent(), true);
addField(caseEditor);
FieldEditor lengthEditor = new IntegerFieldEditor(PASSWORD_LENGTH,
"Password length", getFieldEditorParent());
addField(lengthEditor);
}
}
页面继承了FieldEditorPreferencePage,只需要实现createFieldEditors()即可构建自己的Preference结构;实现了IWorkbenchPreferencePage接口,这样eclipse才能够通过plugin.xml中定义的extension point="org.eclipse.ui.preferencePages"加载本页。程序开始的静态常量是本页要用到的key,用来保存相应的属性值。在createFieldEditors()方法中,RadioGroupFieldEditor是一组Radio Button,省去了自己一个一个的常见控件。相应的还有IntegerFieldEditor,BooleanFieldEditor,StringFieldEditor等等可以使用,使用方法十分简单,参考api即可。实现的效果如下:

在plugin.xml文件中加入如下内容:
<extension
point="org.eclipse.ui.preferencePages">
<page
class="com.mi.pwdgate.dialog.PreferenceEditorPage"
id="com.mi.pwdgate.dialog.PreferenceEditorPage"
name="PassGate"/>
<page
category="com.mi.pwdgate.dialog.PreferenceEditorPage"
class="com.mi.pwdgate.dialog.PreferencePassPolicyPage"
id="com.mi.pwdgate.dialog.PreferencePassPolicyPage"
name="Password Policy"/>
</extension>
class为自己编写的preference页面的类,id可以任意取,但必须要使唯一的,一般都用类名,name是用来显示在界面上的名字,category是当前的Preference属于哪个Preference,就填写哪个Preference的id。本例中Password Policy的父节点是PassGate。
设定Preference的默认值
编写PreferenceInitializer.java,在这里设定preference的默认值,必须要继承AbstractPreferenceInitializer类。
public class PreferenceInitializer extends AbstractPreferenceInitializer {
public void initializeDefaultPreferences() {
IPreferenceStore store = PwdgatePlugin.getDefault()
.getPreferenceStore();
// for PassPolicy Preference
store.setDefault(PreferencePassPolicyPage.PASSWORD_CHARS,
PreferencePassPolicyPage.ALPHANUMERIC);
store.setDefault(PreferencePassPolicyPage.PASSWORD_CASE,
PreferencePassPolicyPage.LOWER);
store.setDefault(PreferencePassPolicyPage.PASSWORD_LENGTH, 8);
// for interaction preference
store.setDefault(PreferenceInteractionPage.DELETE_COMFIRM, true);
store.setDefault(PreferenceInteractionPage.DELETE_TO_BIN, true);
}
}
在plugin.xml文件中加入如下内容:
<extension
point="org.eclipse.core.runtime.preferences">
<initializerclass="com.mi.pwdgate.dialog.PreferenceInitializer"/>
</extension>
再给一张截图

本文介绍如何在Eclipse RCP应用中创建自定义偏好设置页面,并演示密码策略配置的具体实现方式,包括如何使用RadioGroupFieldEditor等组件简化UI开发。
4209

被折叠的 条评论
为什么被折叠?



