首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用FieldEditor#setEnabled时要设置哪些父级?

调用FieldEditor#setEnabled时要设置哪些父级?
EN

Stack Overflow用户
提问于 2018-01-28 23:20:23
回答 1查看 69关注 0票数 0

我正在通过扩展FieldEditorPreferencePage类在Eclipse中构建一个首选项页面。此页面包含两个字段:1个BooleanFieldEditor (复选框)和1个FileFieldEditor。我想禁用/启用复选框值后面的文件字段。我做了这样的事情(没有显示一些明显的代码):

代码语言:javascript
复制
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需要它吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-29 08:06:12

您正在为首选项页面使用默认的FLAT布局。当使用此布局时,对getFieldEditorParent的每个调用都会生成一个新的组合,因此您只需进行一个调用,并记住正确的父调用。使用GRID布局,getFieldEditorParent总是返回相同的父级。这是实际代码:

代码语言:javascript
复制
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控件,因此它需要知道正确的父组合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48492446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档