恢复默认值时不调用propertyChange

时间:2018-03-02 14:55:49

标签: eclipse propertychangelistener

我正在构建一个扩展FieldEditorPreferencePage类的首选项页面。 这是代码(一些明显的代码没有显示):

public class PreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {

    public static final String PREF_KEY_1 = "checkBoxPref";
    public static final String PREF_KEY_2 = "filePref";
    private FileFieldEditor pathField;
    private BooleanFieldEditor yesOrNoField;
    private Composite pathFieldParent;

    @Override
    public void init(IWorkbench workbench) {
        setPreferenceStore(new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID));
    }

    @Override
    protected void createFieldEditors() {
        this.yesOrNoField = new BooleanFieldEditor(PREF_KEY_1, "Check this box!", getFieldEditorParent());
        this.pathFieldParent = getFieldEditorParent();
    this.pathField = new FileFieldEditor(PREF_KEY_2, "Path:", this.pathFieldParent); 
        addField(this.yesOrNoField);
        addField(this.pathField);
        boolean isChecked = getPreferenceStore().getBoolean(PREF_KEY_1); 
        updatePathFieldEnablement(! isChecked);
    }

    /**
     * Updates the fields according to entered values
     */
    private void updatePathFieldEnablement(boolean enabled) {
        this.pathField.setEnabled(enabled, this.pathFieldParent);
    }

    @SuppressWarnings("boxing")
    @Override
    public void propertyChange(PropertyChangeEvent event) {
        if (event.getProperty().equals(FieldEditor.VALUE) && event.getSource() == this.yesOrNoField) {
            updatePathFieldEnablement(! (boolean) event.getNewValue());
        }
        super.propertyChange(event);
    }
}

propertyChange方法用于启用/禁用FileFieldEditor,具体取决于BooleanFieldEditor值。

如果我通过选中或取消选中它来更改BooleanFieldEditor valeu,它可以正常工作,但是当我点击"恢复默认值时,不会调用propertyChange"按钮。

有人看到了这个原因吗?

1 个答案:

答案 0 :(得分:0)

好的,我想我得到了回复。

我进一步调查,我得到了这个似乎对我怀疑的代码:

在类BooleanFieldEditor中:

@Override
protected void doLoadDefault() {
    if (checkBox != null) {
        boolean value = getPreferenceStore().getDefaultBoolean(getPreferenceName());
        checkBox.setSelection(value);
        wasSelected = value;
    }
}

并在StringFieldEditor类中

@Override
protected void doLoadDefault() {
    if (textField != null) {
        String value = getPreferenceStore().getDefaultString(
                getPreferenceName());
        textField.setText(value);
    }
    valueChanged();
}

我们可以看到FileFieldEditor(继承自StringFieldEditor)向其侦听器(valueChanged();)启动PropertyChangeEvent,但不向BooleanFieldEditor启动。我没有找到任何表明BooleanFieldEditor正在使用其他机制的代码。我认为这是jFace中的一个错误。

要解决此问题,我只需要覆盖FieldEditorPreferencePage#performDefaults方法,结果就可以了。