在Grid中使用GXT ComboBox的bug的解决方法

时间:2014-07-23 12:45:56

标签: java gwt gxt

我创建了一个GXT(Pro)网格。其中一列包含一个可编辑的枚举。为了能够编辑这个枚举,我创建了一个非常简单的ComboBox<Enum>

public class EnumCombo<E extends Enum<E>> extends ComboBox<E> {

  public EnumCombo(Class<E> clazz) {
    //EnumModelKeyProvider and EnumLabelProvider are my custom classes and are trivial.
    super(new ListStore<E>(new EnumModelKeyProvider<E>()), new EnumLabelProvider<E>());
    for(E e : clazz.getEnumConstants()) {
      getStore().add(e);
    }
    setTriggerAction(ComboBoxCell.TriggerAction.ALL); //This line is problematic
  }
}

错误:在网格中,当我尝试在ComboBox中选择一个元素时,突出显示的元素不是我悬停的元素。

Selection problem

提示:如果我删除setTriggerAction(ComboBoxCell.TriggerAction.ALL);(但我需要显示所有值),则不会发生这种情况。

提示:如果组合不在网格中,则不会发生这种情况。

我做错了吗?有解决方法吗?

编辑 EnumModelKeyProvider 的代码:

public class EnumModelKeyProvider<T extends Enum> implements ModelKeyProvider<T> {

  @Override
  public String getKey(T item) {
    return item.name();
  }
}

EnumModelKeyProvider 的代码:

public class EnumLabelProvider<T extends Enum<T>> implements LabelProvider<T> {

  @Override
  public String getLabel(T item) {
    return EnumUtils.i18nEnum(item);
  }
}

整个网格代码:

public class GridAuditLigne extends Grid<AuditLigne> {

  @Inject
  private GridAuditLigne(GridAuditLignePropertyAccess pa) {
    super(new HasIdListStore<AuditLigne>(), new ColumnModel<AuditLigne>(buildColumnList(pa)));
    getView().setForceFit(true);
    GridEditing<AuditLigne> editing = new GridInlineEditing<AuditLigne>(this);
    ColumnConfig<AuditLigne, AuditLigneStatut> colStatut = getColumnModel().getColumn(3);
    editing.addEditor(colStatut, new ComboEnum<AuditLigneStatut>(AuditLigneStatut.class));
    getStore().addSortInfo(new Store.StoreSortInfo<AuditLigne>(pa.controleContratLibelle(), SortDir.ASC));
  }

  public static List<ColumnConfig<AuditLigne, ?>> buildColumnList(GridAuditLignePropertyAccess props) {
    List<ColumnConfig<AuditLigne, ?>> result = Lists.newArrayList();
    result.add(Grids.hidden(new IdCol<AuditLigne>(props.id())));
    result.add(new StringCol<AuditLigne>(props.controleContratLibelle(), "Contrôle"));
    result.add(new StringCol<AuditLigne>(props.controleContratTexte(), "Description"));
    result.add(new EnumCol<AuditLigne, AuditLigneStatut>(props.auditLigneStatut(), "Statut"));
    return result;
  }

  public interface GridAuditLignePropertyAccess extends PropertyAccess<AuditLigne> {

    ValueProvider<AuditLigne, Integer> id();

    @Editor.Path("controleContrat.libelle")
    ValueProvider<AuditLigne, String> controleContratLibelle();

    @Editor.Path("controleContrat.texte")
    ValueProvider<AuditLigne, String> controleContratTexte();

    ValueProvider<AuditLigne, AuditLigneStatut> auditLigneStatut();
  }
}

0 个答案:

没有答案