我在方法级别使用@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;

10-02 05:51