TitleAreaDialog中DirectoryFieldEditor按键时不触发验证问题排查
问题分析与解决方案
核心原因
DirectoryFieldEditor的VALIDATE_ON_KEY_STROKE行为依赖于FieldEditorPreferencePage提供的页面环境——它会自动绑定文本控件的修改事件到验证逻辑。但你用的TitleAreaDialog没有这套内置的绑定机制,所以即使设置了该常量,也不会触发按键时的实时验证。
解决步骤
1. 替换KeyListener为ModifyListener
KeyListener会在文本未完成更新时触发,导致isValid()拿到旧值,验证结果不准确。改用ModifyListener,它会在文本内容真正变化后触发:
// 获取DirectoryFieldEditor内部的文本控件 Text textField = (Text) dirFieldExportPath.getControl(getDialogArea()).getChildren()[0]; // 添加文本修改监听器 textField.addModifyListener(e -> { // 手动触发编辑器的验证逻辑 dirFieldExportPath.validate(); // 更新TitleAreaDialog的错误提示 if (!dirFieldExportPath.isValid()) { setErrorMessage(dirFieldExportPath.getErrorMessage()); } else { setErrorMessage(null); } // 手动触发属性变化事件(如果需要IPropertyChangeListener响应) String newValue = textField.getText(); dirFieldExportPath.fireValueChanged(FieldEditor.VALUE, null, newValue); });
2. 确保VALIDATE_ON_KEY_STROKE的正确设置
虽然TitleAreaDialog不自动处理,但仍需在初始化DirectoryFieldEditor时明确设置:
dirFieldExportPath.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
3. 放弃load()的临时方案
调用load()会重置控件的内容和光标位置,这就是光标跳转到开头的原因。上面的ModifyListener方案已经能实现实时验证,无需再用这个方法。
为什么FieldEditorPreferencePage里正常?
FieldEditorPreferencePage内部会调用FieldEditor的setPage方法,传入自身实现的IPreferencePage接口,FieldEditor会基于这个页面自动绑定验证事件、处理状态同步,所以按键验证能正常工作。
内容的提问来源于stack exchange,提问作者know
相关产品推荐
相关产品推荐

