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