Gwt 单列中多个单元格的事件

Gwt 单列中多个单元格的事件,gwt,gwt2,gwt-celltable,Gwt,Gwt2,Gwt Celltable,我在一列中有两个按钮(编辑+删除) ButtonCell functionButtonCell = new ButtonCell() { @Override public void render(final Context context, final SafeHtml data, final SafeHtmlBuilder sb) { sb.appendHtmlConstant("<button type='button' class='gwt-B

我在一列中有两个按钮(编辑+删除)

    ButtonCell functionButtonCell = new ButtonCell() {
    @Override
    public void render(final Context context, final SafeHtml data, final SafeHtmlBuilder sb) {
        sb.appendHtmlConstant("<button type='button' class='gwt-Button' style = 'width:60px;margin:1px;'>Edit</button>");
        sb.appendHtmlConstant("<br/>");
        sb.appendHtmlConstant("<button type='button' class='gwt-Button' style = 'width:60px;margin:1px;'>Delete</button>");
        }
    };
    functionColumn = new Column<AdminModel, String>(functionButtonCell) {
        public String getValue(final AdminModel object) {
            return object.getSeq().toString();
        }
    };
ButtonCell函数ButtonCell=new ButtonCell(){
@凌驾
公共void呈现(最终上下文上下文、最终安全HTML数据、最终安全HTMLBuilder sb){
(b)附加“编辑”);
sb.附录HtmlConstant(“
”); (b)附录(删除); } }; functionColumn=新列(functionButtonCell){ 公共字符串getValue(最终AdminModel对象){ 返回object.getSeq().toString(); } };
在Presenter中将此列的事件绑定为

.........
view.getFunctionColumn().setFieldUpdater(new FieldUpdater<AdminModel, String>() {

   public void update(final int index, final AdminModel object, final String value) {
            Window.alert(index + "-" + value);
        }
    });
。。。。。。。。。
view.getFunctionColumn().setFieldUpdater(新的FieldUpdater()){
公共void更新(最终int索引、最终AdminModel对象、最终字符串值){
窗口警报(索引+“-”+值);
}
});
单击“编辑”按钮后,会出现警告框,但不会出现在“删除”按钮上。当我点击删除按钮时,什么也没有出现。有什么问题吗

添加:如何确定用户从演示者中单击了哪个按钮(编辑或删除)


我真的很感激你的任何建议,因为我很长一段时间都在为它烦恼。谢谢

理想情况下,列应该只有一种类型的单元格,即
ImageCell
ButtonCell
等,因为所有这些
ImageCell
ButtonCell
都不提供任何内置事件。事件由
FieldUpdater
本身处理,它没有用于识别单击的
ButtonCell
的区别。理想情况下,单击该列时,将调用字段更新程序

您应该创建自己的复合小部件,它扩展了
HasCell
。这个组合小部件将有两个不同的按钮,这些内置方法在单击相应的按钮时被调用

public void onModuleLoad() {
    CellTable<Person> table = new CellTable<Person>();

    List<HasCell<Person, ?>> cells = new LinkedList<HasCell<Person, ?>>();
    cells.add(new ActionHasCell("Edit", new Delegate<Person>() {

        @Override
        public void execute(Person object) {
           // EDIT CODE
        }
    }));
    cells.add(new ActionHasCell("Delete", new Delegate<Person>() {

        @Override
        public void execute(Person object) {
            // DELETE CODE
        }
    }));

    CompositeCell<Person> cell = new CompositeCell<Person>(cells);
    table.addColumn(new TextColumn<Person>() {

        @Override
        public String getValue(Person object) {
            return object.getName()
        }
    }, "Name");

    // ADD Cells for Age and Address

    table.addColumn(new Column<Person, Person>(cell) {

        @Override
        public Person getValue(Person object) {
            return object;
        }
    }, "Actions");


}

private class ActionHasCell implements HasCell<Person, Person> {
    private ActionCell<Person> cell;

    public ActionHasCell(String text, Delegate<Person> delegate) {
        cell = new ActionCell<Person>(text, delegate);
    }

    @Override
    public Cell<Person> getCell() {
        return cell;
    }

    @Override
    public FieldUpdater<Person, Person> getFieldUpdater() {
        return null;
    }

    @Override
    public Person getValue(Person object) {
        return object;
    }
}
模块加载()上的公共void{
CellTable=新的CellTable();
列表单元格=新建LinkedList();
添加(新建ActionHasCell(“编辑”,新建委托)(){
@凌驾
公共void执行(Person对象){
//编辑代码
}
}));
添加(新建ActionHasCell(“删除”,新建委托)(){
@凌驾
公共void执行(Person对象){
//删除代码
}
}));
复合细胞=新的复合细胞(细胞);
table.addColumn(新的TextColumn(){
@凌驾
公共字符串getValue(Person对象){
返回object.getName()
}
}“姓名”);
//为年龄和地址添加单元格
表.addColumn(新列(单元格){
@凌驾
公共人物getValue(人物对象){
返回对象;
}
}“行动”);
}
私有类ActionHasCell实现了HasCell{
私人行动细胞;
公共ActionHasCell(字符串文本,委托){
单元格=新的ActionCell(文本,委托);
}
@凌驾
公共单元getCell(){
返回单元;
}
@凌驾
公共字段更新程序getFieldUpdater(){
返回null;
}
@凌驾
公共人物getValue(人物对象){
返回对象;
}
}
另外,请参见下面的链接。
[

ButtonCell
仅过滤第一个子元素上的事件:这就是为什么单击第二个按钮时不会得到事件的原因(注意:该代码的目标是确保您单击了按钮,而不是按钮周围的空白处;请参阅)

实现双按钮单元格的最简单方法是使用;它要求将子单元格渲染为同级元素(默认情况下使用
s,下面的示例将覆盖渲染以使用
s,这样按钮就可以在各自的行上堆叠)。

newcompositecell(Arrays.asList(
//第一个按钮
新的HasCell(){
@重写公共单元格getCell(){return new ButtonCell();}
@覆盖公共字段更新的getFieldUpdater(){
返回新的FieldUpdater(){
@重写公共void更新(int索引、AdminModel对象、字符串值){
Window.alert(“编辑”+object.getId());
}
};
}
@重写公共字符串getValue(AdminModel o){
返回“编辑”;
}
},
//第二个按钮
新的HasCell(){
@重写公共单元格getCell(){return new ButtonCell();}
@覆盖公共字段更新的getFieldUpdater(){
返回新的FieldUpdater(){
@重写公共void更新(int索引、AdminModel对象、字符串值){
Window.alert(“Delete”+object.getId());
}
};
}
@重写公共字符串getValue(AdminModel o){
返回“删除”;
}
}) {
@覆盖受保护的void呈现(Cell.Context上下文、AdminModel值、SafeHtmlBuilder sb、HasCell-HasCell){
//使用默认值而不是默认值
Cell-Cell=hasCell.getCell();
某人以““””号结尾;
render(context,hasCell.getValue(value),sb);
某人以““””号结尾;
}
};
(注意:在您的情况下,因为按钮的文本不依赖于行对象,所以您可能更应该使用
ActionCell
;它更适合“语义”对于您正在做的事情,但在其他方面几乎是一样的;对于
ActionCell
,您将使用
HasCell
ActionCell
getFieldUpdater
将返回
null,
HasCell
getValue
将只按原样返回
AdminModel`参数)


否则,完全由您自己实现您的
单元
(或
抽象单元
)。

谢谢您的回答,先生!并且…请支持我使用它。我需要创建新的复合类吗?如何将其添加到我的cellTable?@Cataclysm:ActionHasCell是在onModuleLoad()中创建和使用的复合小部件对于CellTable。请尝试理解提供的实现。请不要介意,先生,我还没有理解。
new CompositeCell<AdminModel>(Arrays.asList(
  // First button
  new HasCell<AdminModel, String>() {
    @Override public Cell<String> getCell() { return new ButtonCell(); }
    @Override public FieldUpdated<AdminModel, String> getFieldUpdater() {
      return new FieldUpdater<AdminModel, String>() {
        @Override public void update(int index, AdminModel object, String value) {
          Window.alert("Edit " + object.getId());
        }
      };
    }
    @Override public String getValue(AdminModel o) {
      return "Edit";
    }
  },
  // Second button
  new HasCell<AdminModel, String>() {
    @Override public Cell<String> getCell() { return new ButtonCell(); }
    @Override public FieldUpdated<AdminModel, String> getFieldUpdater() {
      return new FieldUpdater<AdminModel, String>() {
        @Override public void update(int index, AdminModel object, String value) {
          Window.alert("Delete " + object.getId());
        }
      };
    }
    @Override public String getValue(AdminModel o) {
      return "Delete";
    }
  }) {
  @Override protected <X> void render(Cell.Context context, AdminModel value, SafeHtmlBuilder sb, HasCell<String,X> hasCell) {
    // use a <div> instead of the default <span>
    Cell<X> cell = hasCell.getCell();
    sb.appendHtmlConstant("<div>");
    cell.render(context, hasCell.getValue(value), sb);
    sb.appendHtmlConstant("</div>");
  }
};