我在方法级别使用@Preference注释来获取注入的当前首选项值:
@Inject
@Optional
public void updatePrefValue(@Preference(value = PREFERENCE_NAME) String prefValue) {
System.out.println("updatePrefValue with '" + prefValue + "'.");
this.prefValue = prefValue;
if (lblPrefValue != null && !lblPrefValue.isDisposed()) {
lblPrefValue.setText(prefValue);
}
}
在几个地方(例如vogella和书中的Eclipse 4 by Marc Teufel和Jonas Helming博士)已经说过,当偏好值发生变化时,会再次调用此方法。
因此,在按下设置新首选项值的按钮后
IEclipsePreferences node = ConfigurationScope.INSTANCE.getNode(PREFERENCES_NODE);
node.put(PREFERENCE_NAME, txtNewPrefValue.getText());
try {
node.flush();
} catch (BackingStoreException e1) {
e1.printStackTrace();
}
我会假设该方法再次被调用。这是真的,但前提是我不改变ConfigurationScope而是更改InstanceScope。
InstanceScope.INSTANCE.getNode(PREFERENCES_NODE).put(PREFERENCE_NAME, txtNewPrefValue.getText());
可以在github上看到该示例的完整源代码。
有可能这样做吗?或者这是一个错误?
亲切的问候, tobbaumann
更新 如果我指定nodePath包括注释的范围(/ configuration / ...)
@Inject
@Optional
public void updatePrefValue(@Preference(nodePath = "/configuration/" + PREFERENCES_NODE, value = PREFERENCE_NAME) int intPrefValue) {
System.out.println("updatePrefValue with '" + intPrefValue + "'.");
this.intPrefValue = intPrefValue;
if (lblPrefValue != null && !lblPrefValue.isDisposed()) {
lblPrefValue.setText(String.valueOf(intPrefValue));
}
}
然后,如果ConfigurationScope中的首选项值发生更改,则会再次调用该方法。仍然这不能合理使用,因为第一次调用此方法,参数为null(如果我想设置字符串值)或0(如果我想设置一个整数值)。我认为这是因为在ConfigurationScope中找不到值(尚未)。你想在这里得到的值是DefaultScope的值(在我不使用/ configuration作为nodePath前缀之前注入的值)。
有什么想法吗?
答案 0 :(得分:1)
我遇到了同样的问题,这就是我解决它的方法:
@Inject
public void trackInterface(@Preference(nodePath = "/configuration/"
+ Activator.PLUGIN_ID, value = "InterfacePref") String interfaceName) {
if (interfaceName == null || interfaceName.isEmpty()) {
// Use default preference
IEclipsePreferences preferences = DefaultScope.INSTANCE
.getNode(Activator.PLUGIN_ID);
interfaceName = preferences.get("InterfacePref", "Multicast");
}
else
lblInterfaceName = interfaceName;