标签:
选择主菜单"窗口---->首选项"命令打开"首选项"窗口.此窗口是Eclipse设置项的集中营,
修改plugin.xml文件,设置首选项的扩展点:
plug.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension point="org.eclipse.ui.preferencePages">
<page
name="myplugin插件设置"
class="cn.com.kxh.myplugin.RootPreferencePage"
id="cn.com.kxh.myplugin.RootPreferencePage">
</page>
<page
name="DB数据库"
category="cn.com.kxh.myplugin.RootPreferencePage"
class="cn.com.kxh.myplugin.DBPreferencePage"
id="cn.com.kxh.myplugin.DBPreferencePage">
</page>
</extension>
</plugin>
代码说明:
1.org.eclipse.ui.preferencePages 是首选项(Preference)的扩展点
2.name是首选项的树节点显示的名称.
3.class是首选项的树节点所对应的类(还没编写,下一步将完成此类)
4.id是首选项的树节点标识.建议设置成和class一样的名称.
5.category是父节点的id标识,当然,父节点要存在才行.
建立首选项对应的类
在上面的plugin.xml文件中已经定义的两个类.
cn.com.kxh.myplugin.RootPreferencePage和cn.com.kxh.myplugin.DBPreferencePage
首选项的类必须继承PreferencePage抽象类并实现IWorkbenchPreferencepage接口.该接口只有一个init方法,抽象类中则有一些"首选项"窗口固有按钮的处理方法需要被实现.
RootPreferencePage.java
1 public class RootPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
2
3 public void init(IWorkbench workbench) {}
4
5 protected Control createContents(Composite parent) {
6 Composite topComp = new Composite(parent, SWT.NONE);
7 topComp.setLayout(new RowLayout());
8 new Label(topComp, SWT.NONE).setText("欢迎使用myplugin插件");
9 return topComp;
10 }
11 }
DBPreferencePage.java
1 public class DBPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, ModifyListener {
2 // 为文本框定义三个键值
3 public static final String URL_KEY = "$URL_KEY";
4 public static final String USERNAME_KEY = "$USERNAME_KEY";
5 public static final String PASSWORD_KEY = "$PASSWORD_KEY";
6 // 为文本框值定义三个默认值
7 public static final String URL_DEFAULT = "jdbc:db2://127.0.0.1/mydb";
8 public static final String USERNAME_DEFAULT = "kongxiaohan";
9 public static final String PASSWORD_DEFAULT = "kxhkxhkxhkxh";
10 // 定义三个文本框
11 private Text urlText, usernameText, passwordText;
12 // 定义一个IPreferenceStore对象
13 private IPreferenceStore ps;
14
15 // 接口IWorkbenchPreferencePage的方法,它负责初始化。在此方法中设置一个
16 // PreferenceStore对象,由此对象提供文本框值的读入/写出方法
17 public void init(IWorkbench workbench) {
18 setPreferenceStore(Activator.getDefault().getPreferenceStore());
19 }
20
21 // 父类的界面创建方法
22 protected Control createContents(Composite parent) {
23 Composite topComp = new Composite(parent, SWT.NONE);
24 topComp.setLayout(new GridLayout(2, false));
25
26 // 创建三个文本框及其标签
27 new Label(topComp, SWT.NONE).setText("URL:");
28 urlText = new Text(topComp, SWT.BORDER);
29 urlText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
30
31 new Label(topComp, SWT.NONE).setText("用户名:");
32 usernameText = new Text(topComp, SWT.BORDER);
33 usernameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
34
35 new Label(topComp, SWT.NONE).setText("密码:");
36 passwordText = new Text(topComp, SWT.BORDER | SWT.PASSWORD);
37 passwordText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
38
39 // 取出以前保存的值,并设置到文本框中。如果取出值为空值或空字串,则填入默认值。
40 ps = getPreferenceStore();// 取得一个IPreferenceStore对象
41 String url = ps.getString(URL_KEY);
42 if (url == null || url.trim().equals(""))
43 urlText.setText(URL_DEFAULT);
44 else
45 urlText.setText(url);
46
47 String username = ps.getString(USERNAME_KEY);
48 if (username == null || username.trim().equals(""))
49 usernameText.setText(USERNAME_DEFAULT);
50 else
51 usernameText.setText(username);
52
53 String password = ps.getString(PASSWORD_KEY);
54 if (password == null || password.trim().equals(""))
55 passwordText.setText(PASSWORD_DEFAULT);
56 else
57 passwordText.setText(password);
58
59 // 添加事件监听器。this代表本类,因为本类实现了ModifyListener接口成了监听器
60 usernameText.addModifyListener(this);
61 passwordText.addModifyListener(this);
62 urlText.addModifyListener(this);
63 return topComp;
64 }
65
66 // 实现自ModifyListener接口的方法,当三个文本框中发生修改时将执行此方法。
67 // 方法中对输入值进行了验证并将“确定”、“应用”两按钮使能
68 public void modifyText(ModifyEvent e) {
69 String errorStr = null;// 将原错误信息清空
70 if (urlText.getText().trim().length() == 0) {
71 errorStr = "URL不能为空!";
72 } else if (usernameText.getText().trim().length() == 0) {
73 errorStr = "用户名不能为空!";
74 } else if (passwordText.getText().trim().length() == 0) {
75 errorStr = "密码不能为空!";
76 }
77 setErrorMessage(errorStr);// errorStr=null时复原为正常的提示文字
78 setValid(errorStr == null);// “确定”按钮
79 getApplyButton().setEnabled(errorStr == null);// “应用”按钮
80 }
81
82 // 父类方法。单击“复原默认值”按钮时将执行此方法,取出默认值设置到文本框中
83 protected void performDefaults() {
84 urlText.setText(URL_DEFAULT);
85 usernameText.setText(USERNAME_DEFAULT);
86 passwordText.setText(PASSWORD_DEFAULT);
87 }
88
89 // 父类方法。单击“应用”按钮时执行此方法,将文本框值保存并弹出成功的提示信息
90 protected void performApply() {
91 doSave(); // 自定义方法,保存设置
92 MessageDialog.openInformation(getShell(), "信息", "成功保存修改!");
93 }
94
95 // 父类方法。单击“确定”按钮时执行此方法,将文本框值保存并弹出成功的提示信息
96 public boolean performOk() {
97 doSave();
98 MessageDialog.openInformation(getShell(), "信息", "修改在下次启动生效");
99 return true; // true表示成功退出
100 }
101
102 // 自定义方法。保存文本框的值
103 private void doSave() {
104 ps.setValue(URL_KEY, urlText.getText());
105 ps.setValue(USERNAME_KEY, usernameText.getText());
106 ps.setValue(PASSWORD_KEY, passwordText.getText());
107 }
108 }
运行结果:
将其中的密码删除之后得到下面的提示效果.
这个例子中的核心是IPreferenceStroe对象的使用,用它的getString方法来取值,setValue方法来存值.其次和以前的事件代码写法有所不同的是:本类实现了ModifyListener接口,也成为了一个监听器,这样在各文本框的加入监听器的代码就会简洁很多,不过其事件代码必须保证3个文本框可以共用才行.
此外还用的其他的程序文件.
Activator.java
1 /**
2 * The activator class controls the plug-in life cycle
3 */
4 public class Activator extends AbstractUIPlugin {
5
6 // The plug-in ID
7 public static final String PLUGIN_ID = "cn.com.kxh.myplugin"; //$NON-NLS-1$
8
9 // The shared instance
10 private static Activator plugin;
11
12 /**
13 * The constructor
14 */
15 public Activator() {
16 plugin = this;
17 }
18
19 /**
20 * Returns the shared instance
21 *
22 * @return the shared instance
23 */
24 public static Activator getDefault() {
25 return plugin;
26 }
27
28 /*
29 * (non-Javadoc)
30 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
31 */
32 @Override
33 public void start(BundleContext context) throws Exception {
34 super.start(context);
35 }
36
37 /*
38 * (non-Javadoc)
39 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
40 */
41 @Override
42 public void stop(BundleContext context) throws Exception {
43 plugin = null;
44 super.stop(context);
45 }
46
47 public static ImageDescriptor getImageDescriptor(String path) {
48 return imageDescriptorFromPlugin(PLUGIN_ID, path);
49 }
50
51 }
Messages.java
1 public class Messages {
2 private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle ("cn.com.kxh.myplugin.messages");
3
4 public static String getString(String key) {
5 try {
6 return RESOURCE_BUNDLE.getString(key);
7 } catch (MissingResourceException e) {
8 return ‘!‘ + key + ‘!‘;
9 }
10 }
11 }
messages.properties
LanguageDialog.ok=OK
LanguageDialog.remove=Remove
另外,我在调试程序的时候有一个地方老是报空指针NPE的错误.
最后查到其实是Activator.java这个类要在MANIFEST.MF这个文件中注册正确才行.
MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Myplugin插件
Bundle-SymbolicName: cn.com.kxh.myplugin;singleton:=true
Bundle-Version: 1.0.1
Bundle-Activator: cn.com.kxh.myplugin.Activator
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Bundle-Vendor: Eclipse从入门到精通