Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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:OSGI首选项与PreferenceStore_Java_Eclipse_Osgi_Preferences_Jface - Fatal编程技术网

Java Eclipse:OSGI首选项与PreferenceStore

Java Eclipse:OSGI首选项与PreferenceStore,java,eclipse,osgi,preferences,jface,Java,Eclipse,Osgi,Preferences,Jface,我正在开发一个Eclipse插件(或者实际上是一个基于Eclipse的应用程序的插件),它需要用户输入一些配置 从文档来看,似乎有两个首选API—一个在中,扩展/实现,另一个在中,特定于JFace。那我们也有 OSGI API有一个层次节点树-首选项节点(首选项或IEclipsePreferences)可以有多个子节点,其本身既可以包含单个名称-值对,也可以包含更多子节点。这似乎适用于我的用例——我有一个动态数量的“首选项组”,每个组大约有三个字符串属性(name、description、com

我正在开发一个Eclipse插件(或者实际上是一个基于Eclipse的应用程序的插件),它需要用户输入一些配置

从文档来看,似乎有两个首选API—一个在中,扩展/实现,另一个在中,特定于JFace。那我们也有

OSGI API有一个层次节点树-首选项节点(
首选项
IEclipsePreferences
)可以有多个子节点,其本身既可以包含单个名称-值对,也可以包含更多子节点。这似乎适用于我的用例——我有一个动态数量的“首选项组”,每个组大约有三个字符串属性(name、description、command),可以很好地映射到这些节点

JFace API没有这样的层次结构,每个插件只有一个平面
IPreferenceStore
。但它提供了首选项编辑器页面,然后可以通过实现
iWorkbenchReferencePage
和,将这些页面包括在常用的首选项对话框(窗口/首选项)中。(我仍然需要自己实现偏好页面的一部分,但这个API似乎为此提供了一个很好的基础。)

似乎API通过提供基于IEclipsePreferences的IPreferenceStore实现,以某种方式连接了这两个API,但我仍然不知道如何使用它


因此,我的问题是:如何在首选项对话框中使用分层OSGI
首选项?我只需要一个级别,但我需要用户能够动态添加新节点(每个节点大约有三个首选项)。(不过,这些节点不必有新的首选项页面。)

在首选项页面级别,它似乎希望使用首选项存储。大多数插件从
org.eclipse.ui.plugin.AbstractUIPlugin.getPreferenceStore()
提供的默认值获取其首选项存储。这大致可以转换为一个ScopedReferenceStore,其中包含一个InstanceScope,该InstanceScope的节点与其bundle.id匹配


获取匹配的IEclipsePreferences对象的等效对象是
InstanceScope.INSTANCE.getNode(“bundle.id”)
。这将允许您在下面添加更多节点,但无法从IPreferenceStore访问这些节点。但是,您的首选项页面可以将其首选项存储设置为插件的主首选项存储,并且仍然使用IECLipseReferences或辅助IPreferenceStore来访问额外的首选项(您只需自己编写代码,类似于
org.eclipse.ui.internal.dialogs.EditorsPreferencePage
).

我通过覆盖getPreference存储解决了这个问题,如下所示:

@Override
public IPreferenceStore getPreferenceStore() {
    if (preferenceStore == null) {
        preferenceStore = new ScopedPreferenceStore( InstanceScope.INSTANCE, ID );
    }
    return preferenceStore;
}

对我有用

谢谢,这也是我到目前为止收集的。我现在正沿着这个方法工作。