eclipse e4 - 如何在值更改后注入ConfigurationScope的首选项值?

时间:2013-04-29 16:59:36

标签: eclipse e4

我在方法级别使用@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前缀之前注入的值)。

有什么想法吗?

1 个答案:

答案 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;