3

我在方法级别使用@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和 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上查看。

是否有可能做到这一点?或者它是一个错误?

亲切的问候,托鲍曼

更新: 如果我指定 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 前缀时注入的值)。

有任何想法吗?

4

1 回答 1

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;
于 2013-08-16T18:11:47.873 回答