Eclipse RCP 中创建自己定义首选项,并能读取首选项中的值

Posted zhchoutai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Eclipse RCP 中创建自己定义首选项,并能读取首选项中的值相关的知识,希望对你有一定的参考价值。

Eclipse RCP的插件中若想自定义首选项须要扩展扩展点:

org.eclipse.core.runtime.preferences //该扩展点用于初始化首选项中的值

org.eclipse.ui.preferencePages//该扩展点用于定义自己的首选项页面

技术分享图片

plugin.xml中内容如:

技术分享图片

Database Preferences挂在WorkFlowBase下。须要在category中填写workFlowBase的ID


WorkFlowPreferenceInitializer类。用于初始化首选项中的值

import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.jface.preference.IPreferenceStore;
import mydesigner.WorkFlowActivator;
/**
 * Class used to initialize default preference values.
 * 首选项的初始化
 */
public class WorkFlowPreferenceInitializer extends AbstractPreferenceInitializer {

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
	 */
	public void initializeDefaultPreferences() {
		IPreferenceStore store = WorkFlowActivator.getDefault().getPreferenceStore();
		store.setDefault(WorkFlowPreferenceConstants.P_BOOLEAN, true);
		store.setDefault(WorkFlowPreferenceConstants.P_CHOICE, "choice2");
		store.setDefault(WorkFlowPreferenceConstants.P_STRING,"Default value");
		store.setDefault(WorkFlowPreferenceConstants.USER_NAME, "admin");
		store.setDefault(WorkFlowPreferenceConstants.PASSWORD, "123456");//页面上的初始值
	}
}
WorkFlowPreferenceConstants 该类定义了首选项中的常量

public class WorkFlowPreferenceConstants {

	public static final String P_PATH = "pathPreference";

	public static final String P_BOOLEAN = "booleanPreference";

	public static final String P_CHOICE = "choicePreference";

	public static final String P_STRING = "stringPreference";
	
	public static final String USER_NAME ="userName"; 
	
	public static final String PASSWORD = "passWord";
	
}
WorkFlowBasePreferencePage该类定义了首选项中的workFlow页面

import mydesigner.WorkFlowActivator;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

import com.workflow.preferences.WorkFlowPreferenceConstants;
/**
 * 首选项中的workFlow页面
 * @author lww
 *
 */
public class WorkFlowBasePreferencePage extends PreferencePage implements IWorkbenchPreferencePage{
	
	private Text userName; //username
	private Text password; //密码框
	
	public WorkFlowBasePreferencePage() {
		super();
		setPreferenceStore(WorkFlowActivator.getDefault().getPreferenceStore());
		setDescription("This is a workflowBase PreferencePage!");
	}
	@Override
	public void init(IWorkbench workbench) {
		
	}
	//该方法为必须实现的方法,在此方法中创建页面上的各种控件 
	@Override
	protected Control createContents(Composite parent) {
	   Composite composite = new Composite(parent, SWT.NONE); 
	   composite.setLayout(new GridLayout(2, false)); 
	   //获取保存此页面的PreferenceStore对象 
	   IPreferenceStore preferenceStore = getPreferenceStore(); 

	   new Label(composite, SWT.LEFT).setText("登录username:"); 
	   userName = new Text(composite, SWT.BORDER); 
	   userName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 
	   //设置username为保存在文件里的值 
	   userName.setText(preferenceStore.getString(WorkFlowPreferenceConstants.USER_NAME)); 

	   new Label(composite, SWT.LEFT).setText("登陆password:"); 
	   password = new Text(composite, SWT.BORDER); 
	   password.setEchoChar(‘*‘); //设置密码用*显示
	   password.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 
	   //设置密码为保存在文件里的值 
	   password.setText(preferenceStore.getString(WorkFlowPreferenceConstants.PASSWORD)); 
	   return composite; 
	}
	/* 
	* 覆盖父类中的方法。但单击“恢复默认值”button时调用该方法 
	*/ 
	protected void performDefaults() { 
	   IPreferenceStore preferenceStore = getPreferenceStore(); 
	   userName.setText( preferenceStore.getDefaultString(WorkFlowPreferenceConstants.USER_NAME)); 
	   password.setText( preferenceStore.getDefaultString(WorkFlowPreferenceConstants.PASSWORD)); 
	} 
	/* 
	* 覆盖父类中的方法,但单击“应用”button时调用该方法 
	*/ 
	public boolean performOk() { 
	   IPreferenceStore preferenceStore = getPreferenceStore(); 
	   if (userName != null) 
	    preferenceStore.setValue(WorkFlowPreferenceConstants.USER_NAME, userName.getText()); 
	   if (password != null) 
	    preferenceStore.setValue(WorkFlowPreferenceConstants.PASSWORD, password.getText()); 
	   return true; 
	} 
	@Override//用于扩展自己的button
	protected void contributeButtons(Composite parent) { 
	   // super.contributeButtons(parent); 
	   Button bt1 = new Button(parent, SWT.NONE); 
	   bt1.setText("button一"); 
	   ((GridLayout) parent.getLayout()).numColumns++; 
	   Button bt2 = new Button(parent, SWT.NONE); 
	   bt2.setText("button二"); 
	   ((GridLayout) parent.getLayout()).numColumns++; 
	} 
}
DBPreferencePage该类定义了DB的首选项页面

import org.eclipse.jface.preference.*;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.IWorkbench;

import com.workflow.preferences.WorkFlowPreferenceConstants;

import mydesigner.WorkFlowActivator;

public class DBPreferencePage
	extends FieldEditorPreferencePage
	implements IWorkbenchPreferencePage {

	public DBPreferencePage() {
		super(GRID);
		setPreferenceStore(WorkFlowActivator.getDefault().getPreferenceStore());
		setDescription("A demonstration of a preference page implementation");
	}
	
	/**
	 * Creates the field editors. Field editors are abstractions of
	 * the common GUI blocks needed to manipulate various types
	 * of preferences. Each field editor knows how to save and
	 * restore itself.
	 */
	public void createFieldEditors() {
		addField(new DirectoryFieldEditor(WorkFlowPreferenceConstants.P_PATH, 
				"&Directory preference:", getFieldEditorParent()));
		addField(
			new BooleanFieldEditor(
				WorkFlowPreferenceConstants.P_BOOLEAN,
				"&An example of a boolean preference",
				getFieldEditorParent()));

		addField(new RadioGroupFieldEditor(
				WorkFlowPreferenceConstants.P_CHOICE,
			"An example of a multiple-choice preference",
			1,
			new String[][] { { "&Choice 1", "choice1" }, {
				"C&hoice 2", "choice2" }
		}, getFieldEditorParent()));
		addField(
			new StringFieldEditor(WorkFlowPreferenceConstants.P_STRING, "A &text preference:", getFieldEditorParent()));
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
	 */
	public void init(IWorkbench workbench) {
	}
	
}
运行结果如图:

技术分享图片
设置的值会保存到
runtime-myDesigner.product\.metadata\.plugins\org.eclipse.core.runtime\.settings中会生成文件

MyDesigner.prefs(MyDesigner是当前的插件名)

若要读取该文件里的值:

//获取首选项中的值
		IPreferenceStore store = WorkFlowActivator.getDefault().getPreferenceStore();
		System.out.println("username:" + store.getString(WorkFlowPreferenceConstants.USER_NAME));
		System.out.println("密码:" + store.getString(WorkFlowPreferenceConstants.PASSWORD));//页面上的初始值
		

弹出相应的首选项对话框:

  //将用户引导至首选项配置页面  
        PreferenceManager manager = PlatformUI.getWorkbench().getPreferenceManager();  
        Shell parentShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();  
        PreferenceDialog pd = new PreferenceDialog(parentShell, manager);  
        pd.setSelectedNode("com.workflow.preferences.page.DBPreferencePage");//设置选中的页面  (org.eclipse.ui.preferencePages 扩展点中page的ID)
        pd.open();  

技术分享图片

该对话框中没有搜索过滤栏。

还有一种实现:

  PreferencesUtil.createPreferenceDialogOn(new Shell(), "com.workflow.preferences.page.DBPreferencePage", 
        		new String[]{"com.workflow.preferences.page.WorkFlowBasePreferencePage","com.workflow.preferences.page.DBPreferencePage"}, null).open(); 

界面例如以下所看到的:

技术分享图片

上面的new string 数组參数主要定义左边显示哪些首页项节点栏,若为null,就显示全部的所选项



以上是关于Eclipse RCP 中创建自己定义首选项,并能读取首选项中的值的主要内容,如果未能解决你的问题,请参考以下文章

构建支持 Eclipse 项目的 RCP

如何从 Eclipse RCP 到“主机”Eclipse IDE 进行通信

如何开发eclipse插件

[在运行菜单项中添加Eclipse默认菜单项

如何在 Java 中创建带有连接按钮的 ButtonGroup?

Eclipse RCP Content Assist 无法使用自动激活的字符