我在方法级别使用@Preference批注获取当前注入(inject)的首选项值:
@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以及Marc Teufel和Jonas Helming博士所著的Eclipse 4)中,都说过当偏好值改变时,该方法会再次被调用。
因此,在按下设置新的首选项值的按钮之后
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上看到。
是否有可能做到这一点?还是一个错误?
亲切的问候,
托伯曼
更新:
如果我指定了包含注释范围(/ configuration / ...)的nodePath
@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前缀时,该值在之前注入(inject))。
有任何想法吗?
最佳答案
我遇到了同样的问题,这就是我的解决方法:
@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;