首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eclipse开发-基于FieldEditorPreferencePage内部其他FieldEditor的新值更改FieldEditor

Eclipse开发-基于FieldEditorPreferencePage内部其他FieldEditor的新值更改FieldEditor
EN

Stack Overflow用户
提问于 2014-09-25 16:31:36
回答 1查看 375关注 0票数 2

Nodeclipse preference Page中,我希望在更改expressPath时更新expressVersion。

我在下面添加了代码,但是它不会触发PropertyChangeEvent,所以这个逻辑不会被执行。

这里出了什么问题?

代码语言:javascript
复制
    expressPath = new FileFieldEditor(PreferenceConstants.EXPRESS_PATH, "Express path:", getFieldEditorParent());
    //TODO update expressVersion on expressPath selection
    IPropertyChangeListener listener = new IPropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent event) {
            if (event.getProperty().equals(FieldEditor.IS_VALID)) {
                String newValue = (String) event.getNewValue();
                expressVersion.setStringValue( ProcessUtils.getCurrentVersionOf(newValue) );
            }
        }               
     };
    expressPath.setPropertyChangeListener(listener);
    addField(expressPath);

    expressVersion = new StringFieldEditor(PreferenceConstants.EXPRESS_VERSION, "Selected Express version:", getFieldEditorParent());
    expressVersion.setEnabled(false, getFieldEditorParent());
    addField(expressVersion);        
EN

回答 1

Stack Overflow用户

发布于 2014-09-25 19:28:32

查看FieldEditorPreferencePage的源代码,我发现initialize()正在重置所有文件的PropertyChangeListeners

代码语言:javascript
复制
/**
 * Initializes all field editors.
 */
protected void initialize() {
    if (fields != null) {
        Iterator<FieldEditor> e = fields.iterator();
        while (e.hasNext()) {
            FieldEditor pe = e.next();
            pe.setPage(this);
            pe.setPropertyChangeListener(this);
            pe.setPreferenceStore(getPreferenceStore());
            pe.load();
        }
    }
}

initialize()在createFieldEditors()之后调用;

代码语言:javascript
复制
protected Control createContents(Composite parent) {
    fieldEditorParent = new Composite(parent, SWT.NULL);
    GridLayout layout = new GridLayout();
    layout.numColumns = 1;
    layout.marginHeight = 0;
    layout.marginWidth = 0;
    fieldEditorParent.setLayout(layout);
    fieldEditorParent.setFont(parent.getFont());

    createFieldEditors();

    if (style == GRID) {
        adjustGridLayout();
    }

    initialize();
    checkState();
    return fieldEditorParent;
}

所以可以用下面的代码来解决这个问题

代码语言:javascript
复制
@Override
protected void initialize() {
    super.initialize();
    expressPath.setPropertyChangeListener(new MyPropertyChangeListener(this));
}

private class MyPropertyChangeListener implements IPropertyChangeListener{

    private FieldEditorPreferencePage page;

    public MyPropertyChangeListener(FieldEditorPreferencePage nodePreferencePage) {
        page = nodePreferencePage;
    }

    @Override
    public void propertyChange(PropertyChangeEvent event) {
        page.propertyChange(event);

        // The IS_VALID property is only fired when the valid state changes.
        if (event.getProperty().equals(FieldEditor.IS_VALID)) {
            isValidPath = ((Boolean) event.getNewValue()).booleanValue();
            if (!isValidPath) {
                expressVersion.setStringValue( "Selected path is not valid" );
            }
            return;
        }
        if (!isValidPath) { // if it is still not valid file, we don't need to check again
            return;
        }
        if (event.getProperty().equals(FieldEditor.VALUE)) {
            String newExecutablePath = (String) event.getNewValue();
            expressVersion.setStringValue( ProcessUtils.getCurrentVersionOf(newExecutablePath));
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26033966

复制
相关文章

相似问题

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