来自ViewPart的Eclipse插件访问首选项

来自ViewPart的Eclipse插件访问首选项,view,eclipse-plugin,preferences,View,Eclipse Plugin,Preferences,我有一个透视图,它在工具栏上有一个动作。此操作将打开首选项对话框。因此,此对话框中的首选项绑定到打开它的视图。我选择这种方式是因为用户可以用不同的内容打开此视图的多个编号,并且每个视图都有自己的首选项 如何在ViewPart中访问此首选项? 我是这样试的 IPreferenceStore preferenceStore=Activator.getDefault().getPreferenceStore(); 但Eclipse告诉我: Multiple markers at this line

我有一个透视图,它在工具栏上有一个动作。此操作将打开首选项对话框。因此,此对话框中的首选项绑定到打开它的视图。我选择这种方式是因为用户可以用不同的内容打开此视图的多个编号,并且每个视图都有自己的首选项

如何在ViewPart中访问此首选项? 我是这样试的

IPreferenceStore preferenceStore=Activator.getDefault().getPreferenceStore();
但Eclipse告诉我:

Multiple markers at this line
- The method getDefault() is undefined for the type Activator
- Discouraged access: The type Activator is not accessible due to restriction on required library 
 C:\Users\xxx\eclipse\plugins\org.eclipse.equinox.preferences_3.5.100.v20130422-1538.jar
我在PreferencePage课程中所做的工作:

公共类PaketFilterPreferencePage扩展首选项页{
公共静态final int ALL_PACKETS_SELECTED=1;
公共静态最终整数滤波器\解码器=2;
公共静态final int ALL_解码器=0;
公共静态最终字符串PKFILTER\u PREF=“PaketFilterDecoderPref”;
公共静态最终字符串PKFILTER_NODE=“PaketFilterDecoderNode”;
...
私有void initButtons(){
IPreferenceStore preferenceStore=getPreferenceStore();
intpref=preferenceStore.getInt(PKFILTER\u pref);
if(pref==选择的所有数据包){
选择AllPacketsButton.setSelection(true);
ctv.getTable().setEnabled(false);
如果(选择AllDecoderButton!=null){
选择AllDecoderButton.setEnabled(false);
unselectAllButton.setEnabled(假);
}
}
其他的
选择FilterButton.setSelection(真);
}
@凌驾
受保护的void performDefaults(){
IPreferenceStore preferenceStore=getPreferenceStore();
设置值(PKFILTER\u PREF,ALL\u解码器);
初始化按钮();
}
@凌驾
公共图书馆{
IPreferenceStore preferenceStore=getPreferenceStore();
if(selectAllPacketsButton.getSelection())
preferenceStore.setValue(PKFILTER\u PREF,所有\u数据包\u选中);
else if(decoderNameCurrentCopy.equals(decoderNamesAll))
设置值(PKFILTER\u PREF,ALL\u解码器);
其他的
设置值(PKFILTER\u PREF,FILTER\u解码器);
返回true;
}
}
召唤

setPreferenceStore(Activator.getDefault().getPreferenceStore());
在我的首选项的构造函数中,Page给了我一个空指针。我把这一行添加到我的清单中

Bundle-Activator: xxx.Activator
我还添加了扩展org.eclipse.core.runtime.preferences并将其连接到这个类:

 public class AbstractPreferenceInit extends
    AbstractPreferenceInitializer {

public AbstractPreferenceInit() {
    // TODO Auto-generated constructor stub
}

@Override
public void initializeDefaultPreferences() {
    IEclipsePreferences node = DefaultScope.INSTANCE.getNode(PaketFilterPreferencePage.PKFILTER_NODE);
    node.putBoolean(PaketFilterPreferencePage.PKFILTER_ALL_PACKETS_RADIO, false);
    node.putInt(PaketFilterPreferencePage.PKFILTER_STATUS, PaketFilterPreferencePage.ALL_DECODER);
}
}

您应该为您的插件使用激活器,而不是首选插件。如果activator扩展了
AbstractUIPlugin
,它将有一个
getPreferenceStore()
方法

您的首选项页面需要调用

setPreferenceStore(Activator.getDefault().getPreferenceStore());
初始化期间(通常在构造函数中)

您可能还希望使用
org.eclipse.core.runtime.preferences
扩展点定义一个首选项初始值设定项,以确保首选项始终具有值

更新: 示例激活器

公共类激活器扩展了AbstractUIPlugin{
私有静态激活器插件;
公共激活器(){
}
@凌驾
public void start(BundleContext)引发异常{
super.start(上下文);
plugin=这个;
}
@凌驾
公共void stop(BundleContext上下文)引发异常{
plugin=null;
super.stop(上下文);
}
公共静态激活器getDefault(){
返回插件;
}
}

因此我创建了类
公共类激活器扩展AbstractUIPlugin
getDefault
的实现应该是什么样子?我发现的所有示例都没有显示具体的实现,通常在创建插件时指定激活器,Eclipse为您编写代码。如果创建该类,则必须在MANIFEST.MF中的
Bundle Activator
中指定该类(在MANIFEST.MF/plugin.xml编辑器的概述部分中指定)。在答案中添加了基本激活器代码的示例。更新了开场白并按照您建议的方式更改了激活器
initializeDefaultPreferences()
开始(BundleContext)
from
Activator
类永远不会被调用。请在manifest.mf编辑器的概述部分选中
在加载该插件的一个类时激活该插件。引用首选项存储时,应调用首选项初始值设定项。