GWT单元表和列表框复杂标识符

GWT单元表和列表框复杂标识符,gwt,listbox,celltable,Gwt,Listbox,Celltable,我正在遵循Goolge的示例,介绍如何将ListBox/SelectionCells添加到CellTable,但我不知道如何更改行为,以便不使用显示的字符串值进行匹配 我在@SelectionCell显示的项目不是唯一的(即可以有两个同名元素),因此我需要使用与该对象关联的其他字段来知道选择了哪一个 for (IrrigationProgramDTO program: programOptions) categoryNames.add(program.getName()); Sele

我正在遵循Goolge的示例,介绍如何将ListBox/SelectionCells添加到CellTable,但我不知道如何更改行为,以便不使用显示的字符串值进行匹配

我在@SelectionCell显示的项目不是唯一的(即可以有两个同名元素),因此我需要使用与该对象关联的其他字段来知道选择了哪一个

for (IrrigationProgramDTO program: programOptions)    
 categoryNames.add(program.getName());

SelectionCell categoryCell = new SelectionCell(categoryNames);
Column<IrrigationGapDTO, String> categoryColumn = new Column<IrrigationGapDTO, String>    (categoryCell) {
      @Override
      public String getValue(IrrigationGapDTO object) {
          if (object.getProgramSelected()!=null)
              return object.getProgramSelected().getName();
          else
              return "";
      }
    };      
    categoryColumn.setFieldUpdater(new FieldUpdater<IrrigationGapDTO, String>() {
      public void update(int index, IrrigationGapDTO object, String value) {
          for (IrrigationProgramDTO program: programOptions) {
                  //not valid as there could be more than 1 program with the same name
              if (program.getName().equals(value)) { 
                  object.setProgramSelected(program);
                  break;
              }

          }  
      }
for(灌溉程序到程序:程序选项)
categoryNames.add(program.getName());
SelectionCell categoryCell=新的SelectionCell(categoryNames);
列类别Column=新列(categoryCell){
@凌驾
公共字符串getValue(IrrigationGapDTO对象){
if(object.getProgramSelected()!=null)
返回object.getProgramSelected().getName();
其他的
返回“”;
}
};      
categoryColumn.setFieldUpdater(新的FieldUpdater(){
公共void更新(int索引、IrrigationGapDTO对象、字符串值){
用于(灌溉程序到程序:程序选项){
//无效,因为可能有多个同名程序
如果(program.getName().equals(value)){
object.setProgramSelected(程序);
打破
}
}  
}
3种可能的解决方案:

1.肮脏的解决方法

代替
getName()
返回
getName()
+某些唯一标识符:

public String getValue(IrrigationGapDTO object) {
    if (object.getProgramSelected()!=null)
        return object.getProgramSelected().getName()+"_"+object.getUniqueIdentiufier();
    else
        return "";
}
然后在
FieldUpdater
中,您可以在“\u1”字符上拆分并处理重复项

2.使用唯一id而不是
getName()
: 只需为您的程序生成/分配一个唯一的id,并使用它而不是名称

3.使用
灌溉程序键入而不是
字符串

您可以在列定义中使用
irrigationprogrammedto
类而不是
String
。但是,您可能必须使用用户定义的SelectionCell,它将
irrigationprogrammedto
类型而不是
String
作为数据类型

Column<IrrigationGapDTO, IrrigationProgramDTO> categoryColumn = new Column<IrrigationGapDTO, IrrigationProgramDTO>    (categoryCell) {
  @Override
  public IrrigationProgramDTO (IrrigationGapDTO object) {
      if (object.getProgramSelected()!=null)
          return object.getProgramSelected();
      else
          return null;
  }

};      
categoryColumn.setFieldUpdater(new FieldUpdater<IrrigationGapDTO, IrrigationProgramDTO>() {
  public void update(int index, IrrigationGapDTO object, IrrigationProgramDTO value) {
       object.setProgramSelected(program);
      }  
  }
Column categoryColumn=新列(categoryCell){
@凌驾
公共灌溉程序TO(灌溉GAPDTO对象){
if(object.getProgramSelected()!=null)
返回object.getProgramSelected();
其他的
返回null;
}
};      
categoryColumn.setFieldUpdater(新的FieldUpdater(){
公共void更新(int索引、IrrigationGapDTO对象、IrrigationProgramDTO值){
object.setProgramSelected(程序);
}  
}

以下是我对@Ümit解决方案3的实现:

public static abstract class EditSelectColumn<E, S> {

    Map<String, S> selectionMap = new HashMap<String, S>();

    EditColumn<E> column;

    protected final String relationshipFieldName;

    public EditSelectColumn(String relationshipFieldName) {
        this.relationshipFieldName = relationshipFieldName;

        for (S option : getOptions()) {
            assert getOptionString(option) != null : "Option string cannot be null, please check your database";
            selectionMap.put(getOptionString(option), option);
        }
        SelectionCell cell = new SelectionCell(new ArrayList<String>(selectionMap.keySet()));
        column = new EditColumn<E>(cell) {
            @Override
            public String getValue(E object) {
                if (getOption(object) == null)
                    return "";
                return getOptionString(getOption(object));
            }

            @Override
            public void setValue(E object, String value) {
                setOption(object, selectionMap.get(value));
            }
        };
    }

    public EditColumn<E> getColumn() {
        return column;
    }

    public abstract List<S> getOptions();

    public abstract String getOptionString(S option);

    public abstract S getOption(E object);

    public abstract void setOption(E object, S value);
}
公共静态抽象类EditSelectColumn{
Map selectionMap=newhashmap();
编辑栏;
受保护的最终字符串relationshipFieldName;
public EditSelectColumn(字符串关系ShipFieldName){
this.relationshipFieldName=relationshipFieldName;
对于(S选项:getOptions()){
assert getOptionString(option)!=null:“选项字符串不能为null,请检查您的数据库”;
selectionMap.put(getOptionString(option),option);
}
SelectionCell=新建SelectionCell(新建ArrayList(selectionMap.keySet());
列=新编辑列(单元格){
@凌驾
公共字符串getValue(E对象){
if(getOption(object)==null)
返回“”;
返回getOptionString(getOption(object));
}
@凌驾
public void setValue(对象、字符串值){
setOption(对象,selectionMap.get(值));
}
};
}
公共EditColumn getColumn(){
返回列;
}
公共摘要列表getOptions();
公共抽象字符串getOptionString(S选项);
公共摘要的getOption(E对象);
公共抽象void setOption(E对象,S值);
}

这是我的解决方案3的新实现(请注意,必须向列中添加一个FieldUpdater才能工作):

导入java.util.array;
导入java.util.List;
导入com.google.gwt.cell.client.AbstractEditableCell;
导入com.google.gwt.cell.client.cell;
导入com.google.gwt.cell.client.ValueUpdater;
导入com.google.gwt.core.client.gwt;
导入com.google.gwt.dom.client.BrowserEvents;
导入com.google.gwt.dom.client.Element;
导入com.google.gwt.dom.client.NativeEvent;
导入com.google.gwt.dom.client.SelectElement;
导入com.google.gwt.safehtml.client.SafeHtmlTemplates;
导入com.google.gwt.safehtml.client.SafeHtmlTemplates.Template;
导入com.google.gwt.safehtml.shared.safehtml;
导入com.google.gwt.safehtml.shared.SafeHtmlBuilder;
/**
*用于呈现下拉列表的{@link Cell}。
*
*@作者Gaspard van Koningsveld
*/
公共类ItemSelectionCell扩展了AbstractEditableCell{
接口模板扩展了安全HtmlTemplates{
@模板(“”)
SafeHtml beginSelect();
@模板(“{1}”)
取消选择SafeHtml(int散列,字符串选项);
@模板(“{1}”)
选择安全HTML(int散列,字符串选项);
@模板(“”)
SafeHtml endSelect();
}
私有静态模板;
私人清单项目;
公共项选择单元格(C项数组[]){
这个(Arrays.asList(itemsArray));
}
公共项选择单元格(列表项){
超级(BrowserEvents.CHANGE);
如果(模板==null){
template=GWT.create(template.class);
}
这个项目=项目;
}
@凌驾
public void onBrowserEvent(上下文上下文、元素父级、C值、NativeEvent事件、ValueUpdater ValueUpdater){
onBrowserEvent(上下文、父级、值、事件、值更新程序);
if(BrowserEvents.CHANGE.equals(event.getType())){
SelectElement select=parent.getFirstChild().cast();
int newIndex=select.ge