我确实使用
FieldEditorPreferencePage
,除了其他字段编辑器之外还有PathEditor
,这是唯一一个不听PropertyChangeEvent
的人。无论我添加或删除路径,都没有反应。 org.eclipse.jface.preference.FieldEditor.fireValueChanged(String, Object, Object)
未被解雇。你知道为什么吗?似乎 org.eclipse.jface.preference.FieldEditor.setPropertyChangeListener(IPropertyChangeListener)
为页面上的所有编辑器正确设置了它。注意:我使用的所有其他编辑器都是从 StringFieldEditor
(FileEditor、DirectoryEditor...) 扩展而来的
public class PreferencePage extends ValidatingPreferencePage implements IWorkbenchPreferencePage
{
private String[] styleSheetTypesAllowed = {"xslt","xsl"};
private String[] configTypesAllowed = {"lcc","qml"};
private CustomFileFieldEditor styleSheet;
public PreferencePage()
{
super(GRID);
setPreferenceStore(Activator.getDefault().getPreferenceStore());
}
@Override
public void createFieldEditors()
{
Composite parent = getFieldEditorParent();
// some other fields added
PathEditor pathEditor = new PathEditor(
PreferenceConstants.P_CONFIGPATH,
"Configuration paths",
"Add directory",
parent);
}
@Override
protected void initialize()
{
super.initialize();
isLicense();
}
@Override
protected void performDefaults()
{
// license might be enabled from ini file. If so, keep fields enabled:
enableFieldEditors(isLicense());
super.performDefaults();
}
}
内部
ValidatingPreferencePage
更新了错误消息的处理,根据许可证状态启用字段编辑器并更新了checkState()
方法:
public class ValidatingPreferencePage extends FieldEditorPreferencePage implements FieldEditors
{
// fields, constructors
// super.fields is private - create own list
@Override
protected void addField(FieldEditor editor)
{
if (fields == null)
fields = new ArrayList<>();
fields.add(editor);
super.addField(editor);
}
@Override
public void propertyChange(PropertyChangeEvent event)
{
if (event.getProperty().equals(FieldEditor.IS_VALID))
{
boolean newValue = ((Boolean) event.getNewValue()).booleanValue();
// If the new value is true then we must check all field editors.
// If it is false, then the page is invalid in any case.
if (newValue)
{
checkState();
} else
{
validFileType = true;
invalidFieldEditor = (FieldEditor) event.getSource();
setValid(newValue);
}
}
// handle CTRL+V & delete whole string & focus lost
if (event.getProperty().equals(FieldEditor.VALUE))
{
validFileType = true;
checkState();
}
}
private void setErrorMessagePP()
{
// set error messages
}
@Override
protected void checkState()
{
//super.checkState();
// other code
}
public List<FieldEditor> getFieldEditorList()
{
return fields;
}
}
及界面:
public interface PreferencesValidation
{
public void enableValidation(boolean enableVal);
public void setEmptyStringAllowed(boolean emptyStringAllowed);
public void setEnabled(boolean newValue, Composite parent);
public void refreshValidState();
public boolean checkState();
public boolean handlesLicense();
public String getDependsOn();
}
正如 @greg-449 提到的,我必须自己解雇
fireStateChanged
。为了添加路径,我使用 getNewInputObject()
来聊天事件:
@Override
public String getNewInputObject()
{
oldState = isValid;
oldValue = getList().getItems();
String dirPath = super.getNewInputObject();
// other code
if (isValid != oldState)
fireStateChanged(IS_VALID, oldState, isValid);
return dirPath;
}
从编辑器中删除路径时进行验证 - 我在
CustomPathEditor
构造函数中添加侦听器:
if (enableValidation)
{
getRemoveButton().addListener(SWT.Selection, new Listener()
{
// handle validation after path was removed
@Override
public void handleEvent(Event event)
{
oldState = isValid;
oldValue = getList().getItems();
valueChanged();
}
});
}