0

我通过扩展 FieldEditorPreferencePage 类在 Eclipse 中构建首选项页面。此页面包含 2 个字段: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" 需要它吗?

谢谢。

4

1 回答 1

0

您正在使用首选项页面的默认FLAT布局。当使用此布局时,每次调用都会getFieldEditorParent生成一个新的 Composite,因此您只需进行一次调用并记住正确的父级。使用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控件,因此它需要知道正确的父 Composite。

于 2018-01-29T08:06:12.267 回答