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>");
}
};