恢复默认值时不调用 propertyChange
propertyChange not called when restoring default values
我正在构建一个扩展 FieldEditorPreferencePage class 的首选项页面。
这是代码(一些明显的代码没有显示):
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 值,enable/disable FileFieldEditor 有 propertyChange 方法。
如果我通过选中或取消选中它来更改 BooleanFieldEditor 值,它工作正常,但是当我点击 "Restore default values" 按钮时不会调用 propertyChange。
有人知道这样做的原因吗?
好的,我想我已经收到回复了。
我进一步调查,发现这段代码对我来说似乎很可疑:
在 class 布尔字段编辑器中:
@Override
protected void doLoadDefault() {
if (checkBox != null) {
boolean value = getPreferenceStore().getDefaultBoolean(getPreferenceName());
checkBox.setSelection(value);
wasSelected = value;
}
}
并在 class 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
方法,结果很好。
我正在构建一个扩展 FieldEditorPreferencePage class 的首选项页面。 这是代码(一些明显的代码没有显示):
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 值,enable/disable FileFieldEditor 有 propertyChange 方法。
如果我通过选中或取消选中它来更改 BooleanFieldEditor 值,它工作正常,但是当我点击 "Restore default values" 按钮时不会调用 propertyChange。
有人知道这样做的原因吗?
好的,我想我已经收到回复了。
我进一步调查,发现这段代码对我来说似乎很可疑:
在 class 布尔字段编辑器中:
@Override
protected void doLoadDefault() {
if (checkBox != null) {
boolean value = getPreferenceStore().getDefaultBoolean(getPreferenceName());
checkBox.setSelection(value);
wasSelected = value;
}
}
并在 class 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
方法,结果很好。