为什么 propertyChangeListener 对 PathEditor 中的更改没有反应

问题描述 投票:0回答:1

我确实使用

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();
}
eclipse-rcp jface
1个回答
0
投票

正如 @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();
        }
      });
    }
© www.soinside.com 2019 - 2024. All rights reserved.