Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Eclipse:以编程方式创建首选项页面_Java_Eclipse_Eclipse Rcp_Preferences - Fatal编程技术网

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

Java Eclipse:以编程方式创建首选项页面,java,eclipse,eclipse-rcp,preferences,Java,Eclipse,Eclipse Rcp,Preferences,我正在尝试以编程方式创建首选项页面,我需要在plugin.xml中使用首选项页面,而不定义preferencePage扩展点 我非常接近解决方案,我能够在第一次加载应用程序时加载页面并保存值 我的代码的核心是 PreferenceManager pmngr= PlatformUI.getWorkbench().getPreferenceManager(); //this come from other plugins that implements my personal IPreferenc

我正在尝试以编程方式创建首选项页面,我需要在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,所以这一点我让我的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中缺少了一些东西
我现在无法修复我的代码,有人成功地以编程方式创建了首选项页面???

最后我发现,使用默认首选项页面查看器,我无法通过代码完成这项工作


因此,我实现了一个处理程序,它可以在每次调用和每次创建节点和页面时加载PreferenceDialog。这是我找到并运行的唯一方法。

以下是java代码,它允许以编程方式创建首选项页面:


//创建自定义MyPreference类的实例
IPreferencePage=new MyPreference();
第页设置标题(“自定义配置”)

//创建将显示在首选项窗口中的新首选项节点 PreferenceNode=新的PreferenceNode(“1”,第页)

//使用工作台的首选项管理器 PreferenceManager pm=PlatformUI.getWorkbench().getPreferenceManager()

addToRoot(节点)//在PreferenceManager中添加节点

Shell Shell=PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell()

//实例化PreferenceDialog PreferenceDialog pd=新建PreferenceDialog(shell,pm)

//这一行很重要,它告诉首选项对话框它应该写入哪个首选项存储 pd.setPreferenceStore(Activator.getDefault().getPreferenceStore()); pd.create(); pd.open()


斯基普给出的答案几乎是正确的

引发异常的原因是, 对话框关闭后,页面将从IPreferenceNode中删除,但该节点仍保留在PreferenceManager中,因此它会引发找不到页面的异常

在将节点添加到PreferenceManager之前,必须手动删除节点

pm.removeAll()


这将非常有效。

只是好奇-为什么需要以编程方式进行此操作?因为我正在对此进行“简化”,我知道这已经很简单,但我需要进一步简化首选项页面定义!!!因此,我想定义我自己的preferencePage扩展点,在这个扩展点中,接口非常简单,而不是创建真正的扩展点。不幸的是,Achille描述的错误仍然适用。重新打开对话框会导致一系列异常。

//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();

//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();