我正在通过扩展FieldEditorPreferencePage类在Eclipse中构建一个首选项页面。此页面包含两个字段:1个BooleanFieldEditor (复选框)和1个FileFieldEditor。我想禁用/启用复选框值后面的文件字段。我做了这样的事情(没有显示一些明显的代码):
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
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);
}
}我的问题是关于FieldEditor#setEnabled中的第二个参数。此参数是FieldEditor控件的父组合(“用于在需要时创建控件”,javadoc表示)。首先,我用getFieldEditorParent的返回来设置值,但之后我得到了一个异常“不同的父”。所以我结束了它的存储(参见。this.pathFieldParent)并把它还给setEnabled,它就能工作了(或者看起来很有效)。但是我不确定我做得好,特别是因为我必须在我的类中创建一个成员,这对它没有任何意义(如果我有许多字段要启用/禁用,我将不得不创建其中的许多)。
你认为我做的很好还是有更好的方法来提供这个家长?你能解释一下为什么*setEnabled需要它吗?
谢谢。
发布于 2018-01-29 08:06:12
您正在为首选项页面使用默认的FLAT布局。当使用此布局时,对getFieldEditorParent的每个调用都会生成一个新的组合,因此您只需进行一个调用,并记住正确的父调用。使用GRID布局,getFieldEditorParent总是返回相同的父级。这是实际代码:
protected Composite getFieldEditorParent() {
if (style == FLAT) {
// Create a new parent for each field editor
Composite parent = new Composite(fieldEditorParent, SWT.NULL);
parent.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
return parent;
}
// Just return the parent
return fieldEditorParent;
}setEnabled有时确实创建了一个新的Label控件,因此它需要知道正确的父组合。
https://stackoverflow.com/questions/48492446
复制相似问题