简体   繁体   English

Eclipse:以编程方式创建首选项页面

[英]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, 我正在尝试以编程方式创建首选项页面,我需要使用首选项页面而不在plugin.xml中定义preferencePage扩展点我非常接近解决方案,我能够加载页面并在第一次应用程序时保存值负载,

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!!! 其中PreferencePageRCP是我的自定义首选项页面所以这一点我让我的PreferencePage工作!

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 但是当我第二次进入首选项窗口时,我在PreferenceNode.createPage上出现错误,所以现在我自己的PreferenceNode类重写了createPage但是现在我遇到了一个UI错误

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.Control.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??? 所以第二次在UI中缺少一些东西我此时无法修复我的代码,有人成功地以编程方式创建了首选项页面???

Here is the java code, which allows the creation of a preference Page programmatically: 这是java代码,它允许以编程方式创建首选项页面:


//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. 所以我意识到每次调用加载PreferenceDialog的处理程序,每次都创建节点和页面。 that the only way I find and it works. 这是我找到的唯一方法,也是有效的。

Answer given by Skip is almost right. Skip给出的答案几乎是正确的。

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. 引发异常是因为,一旦关闭对话框,页面就会从IPreferenceNode中删除,但该节点仍然保留在PreferenceManager中,因此它会因未找到页面而引发异常。

We must manually remove the nodes before adding the nodes to PreferenceManager. 在将节点添加到PreferenceManager之前,我们必须手动删除节点。

pm.removeAll() 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. 这将完美地工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM