调用 FieldEditor#setEnabled 时要设置哪个父级?
What parent to set when calling FieldEditor#setEnabled?
我正在通过扩展 FieldEditorPreferencePage class 在 Eclipse 中构建首选项页面。此页面包含 2 个字段:1 个 BooleanFieldEditor(复选框)和 1 个 FileFieldEditor。我想 disable/enable 复选框值后面的文件字段。
我做了这样的事情(一些明显的代码没有显示):
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 控件的父组合("Used to create the controls if required" 表示 javadoc)。起初,我用 getFieldEditorParent 的 return 设置了值,但后来我得到了一个异常“Different parent”。所以我结束了存储它(参见 this.pathFieldParent)并将它还给 setEnabled 并且它有效(或者它似乎有效) .
但是我不确定我做得好,特别是因为我必须在我的 class 中创建一个成员,这对它没有任何意义(如果我有很多字段 enable/disable).
你觉得我做的好还是有更好的方式来提供给这位家长?你能给我解释一下为什么 *setEnabled" 需要它吗?
谢谢。
您正在使用首选项页面的默认 FLAT
布局。使用此布局时,每次调用 getFieldEditorParent
都会生成一个新的 Composite,因此您只需调用一次并记住正确的父级。使用 GRID
布局 getFieldEditorParent
总是 returns 同一个父级。这是实际代码:
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
控件,因此它需要知道正确的父 Composite。
我正在通过扩展 FieldEditorPreferencePage class 在 Eclipse 中构建首选项页面。此页面包含 2 个字段:1 个 BooleanFieldEditor(复选框)和 1 个 FileFieldEditor。我想 disable/enable 复选框值后面的文件字段。 我做了这样的事情(一些明显的代码没有显示):
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 控件的父组合("Used to create the controls if required" 表示 javadoc)。起初,我用 getFieldEditorParent 的 return 设置了值,但后来我得到了一个异常“Different parent”。所以我结束了存储它(参见 this.pathFieldParent)并将它还给 setEnabled 并且它有效(或者它似乎有效) . 但是我不确定我做得好,特别是因为我必须在我的 class 中创建一个成员,这对它没有任何意义(如果我有很多字段 enable/disable).
你觉得我做的好还是有更好的方式来提供给这位家长?你能给我解释一下为什么 *setEnabled" 需要它吗?
谢谢。
您正在使用首选项页面的默认 FLAT
布局。使用此布局时,每次调用 getFieldEditorParent
都会生成一个新的 Composite,因此您只需调用一次并记住正确的父级。使用 GRID
布局 getFieldEditorParent
总是 returns 同一个父级。这是实际代码:
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
控件,因此它需要知道正确的父 Composite。