Eclipse: 编程创建偏好设置页面

4
我是一名有用的助手,可以翻译文本。
我正在尝试以编程方式创建首选项页面,我需要在不在plugin.xml中定义preferencePage扩展点的情况下使用首选项页面。我离解决方案非常接近,我能够在应用程序加载时第一次加载页面并保存值。
我的代码核心如下:
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);

我的PreferencePageRCP是自定义的首选项页面,所以现在我已经使我的PreferencePage工作!

但当我第二次打开首选项窗口时,在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
.................

所以第二次UI中缺少了某些内容,我现在无法修复我的代码,有人成功地通过编程方式创建了首选项页面吗?


只是好奇 - 你为什么需要以编程方式完成这个任务? - vwegert
1
因为我正在进行这个“简化”的工作,我知道它已经很简单了,但我需要更简化偏好页面的定义!!! 所以我想定义自己的preferencePage扩展点,其中接口非常简单,然后我创建真正的扩展点。 - Achille
3个回答

3

以下是Java代码,可以通过编程方式创建首选项页面:


//create an instance of the custom MyPreference class
IPreferencePage page = new MyPreference(); 
page.setTitle("Custom Configurations");

//创建一个新的PreferenceNode,它将出现在Preference窗口中 PreferenceNode node = new PreferenceNode("1", page);
//使用工作台的首选项管理器 PreferenceManager pm = PlatformUI.getWorkbench().getPreferenceManager(); pm.addToRoot(node);//将节点添加到PreferenceManager中
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
//实例化PreferenceDialog PreferenceDialog pd = new PreferenceDialog(shell, pm);
//这行很重要,它告诉PreferenceDialog应该写入哪个首选项存储 pd.setPreferenceStore(Activator.getDefault().getPreferenceStore()); pd.create(); pd.open();

不幸的是,Achille所描述的错误仍然存在。重新打开对话框会导致一堆异常。 - Skip

2

最终,我发现使用默认的首选项页面查看器无法通过代码完成这个任务!

因此,我创建了一个处理程序,在每次调用时加载首选项对话框,并创建节点和页面。这是我找到的唯一可行的方法,而且它确实有效。


1

Skip给出的答案几乎正确。

异常是因为一旦对话框关闭,页面就会从IPreferenceNode中移除,但节点仍然存在于PreferenceManager中,因此它会因找不到页面而引发异常。

在将节点添加到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();

这将完美地工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接