Eclipse: create preference page programmatically
I'm trying to create a preference page programmatically, I need to work with preference pages without define preferencePage extension point in plugin.xml I'm very close to solution, I'm able to load page and save the value the first time application loads,
the core of my code is
PreferenceManager pmngr= PlatformUI.getWorkbench().getPreferenceManager();
//this come from other plugins that implements my personal IPreferences
PreferencePageRCP page =new PreferencePageRCP((IPreferences) element.createExecutableExtension("class"));
PreferenceNodeRCP node= new PreferenceNodeRCP(page.getId(), page.getTitle(),null,PreferencePageRCP.class.getName());
node.setPage(page);
pmngr.addToRoot(node);
where PreferencePageRCP is my Custom PreferencePage so a this point I have my PreferencePage working!!!
but when I go a second time to preference window I got an error on PreferenceNode.createPage, so now I did my own PreferenceNode class overriding createPage but now I got an UI error
Problems occurred when invoking code from plug-in: "org.eclipse.jface".
!STACK 0
org.eclipse.swt.SWTException: Widget is disposed
at org.eclipse.swt.SWT.error(SWT.java:4083)
at org.eclipse.swt.SWT.error(SWT.java:3998)
at org.eclipse.swt.SWT.error(SWT.java:3969)
at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:340)
at org.eclipse.swt.widgets.Contro开发者_C百科l.setVisible(Control.java:3370)
at org.eclipse.jface.dialogs.DialogPage.setVisible(DialogPage.java:470)
at org.eclipse.jface.preference.FieldEditorPreferencePage.setVisible(FieldEditorPreferencePage.java:374)
at org.eclipse.jface.preference.PreferenceDialog.showPage(PreferenceDialog.java:1323)
at org.eclipse.ui.internal.dialogs.FilteredPreferenceDialog.showPage(FilteredPreferenceDialog.java:673)
at org.eclipse.jface.preference.PreferenceDialog$10.run(PreferenceDialog.java:708)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
andContributionItem.java:796
.................
So the second time there is something missing in UI I at this point I'm not able to fix my code, there is someone who had success in create Preference Page Programmatically???
Here is the java code, which allows the creation of a preference Page programmatically:
//create an instance of the custom MyPreference class
IPreferencePage page = new MyPreference();
page.setTitle("Custom Configurations");
//create a new PreferenceNode that will appear in the Preference window
PreferenceNode node = new PreferenceNode("1", page);
//use workbenches's preference manager
PreferenceManager pm= PlatformUI.getWorkbench().getPreferenceManager();
pm.addToRoot(node); //add the node in the PreferenceManager
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
//instantiate the PreferenceDialog
PreferenceDialog pd = new PreferenceDialog(shell, pm);
//this line is important, it tell's the PreferenceDialog which preference-store it should write to
pd.setPreferenceStore(Activator.getDefault().getPreferenceStore());
pd.create();
pd.open();
Finally I discovered That simply I can't do this by code using default preference page viewer!
So I realized an handler that load a PreferenceDialog everytime is called and every time create nodes and pages. that the only way I find and it works.
Answer given by Skip is almost right.
The exception is raised because, once the dialog is closed, page is removed from IPreferenceNode, but the node still remains in the PreferenceManager, thus it raises exception for not finding the page.
We must manually remove the nodes before adding the nodes to PreferenceManager.
pm.removeAll()
//create an instance of the custom MyPreference class
IPreferencePage page = new MyPreference();
page.setTitle("Custom Configurations");
//create a new PreferenceNode that will appear in the Preference window
PreferenceNode node = new PreferenceNode("1", page);
//use workbenches's preference manager
PreferenceManager pm= PlatformUI.getWorkbench().getPreferenceManager();
pm.removeAll(); // removes the previous nodes
pm.addToRoot(node); //add the node in the PreferenceManager
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
//instantiate the PreferenceDialog
PreferenceDialog pd = new PreferenceDialog(shell, pm);
//this line is important, it tell's the PreferenceDialog which preference-store it should write to
pd.setPreferenceStore(Activator.getDefault().getPreferenceStore());
pd.create();
pd.open();
This will work perfectly.
精彩评论