簡體   English   中英

恢復默認值時未調用propertyChange

[英]propertyChange not called when restoring default values

我正在構建一個首選項頁面,擴展了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);
    }
}

根據BooleanFieldEditor的值,可以使用propertyChange方法來啟用/禁用FileFieldEditor。

如果我通過選中或取消選中它來更改BooleanFieldEditor值,則可以正常工作,但是當我單擊“恢復默認值”按鈕時,不會調用propertyChange。

有人看到原因嗎?

好吧,我想我已經得到了回應。

我在調查中走得更遠,得到了這段代碼,這對我來說似乎是可疑的:

在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方法,結果就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM