0

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

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

在 Presenter 中将此列的事件绑定为

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

   public void update(final int index, final AdminModel object, final String value) {
            Window.alert(index + "-" + value);
        }
    });

单击编辑按钮后,出现了警告框,但没有出现在删除按钮上。当我点击删除按钮时,什么都没有出现。会有什么问题?

另外: 我如何确定用户从我的演示者那里单击了哪个按钮(编辑或删除)?

我非常感谢您的任何建议,因为我为此困扰了很长时间。谢谢!

4

2 回答 2

1

理想情况下,一列应该只有一种类型的单元格ImageCellButtonCell等等。因为所有这些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;
    }
}

另外,请参阅下面的链接。[ GWT CellTable - 需要在每行的最后一个单元格中有两个按钮

于 2014-06-09T10:44:50.937 回答
1

ButtonCell仅在第一个子元素上过滤事件:https ://gwt.googlesource.com/gwt/+/2.6.1/user/src/com/google/gwt/cell/client/ButtonCell.java这就是你为什么不这样做的原因单击第二个按钮时不会收到事件(注意:该代码的目标是确保您单击了按钮,而不是按钮周围的空白区域;请参阅https://gwt.googlesource.com/gwt/+ /a0dc88c8be7408be9554f746eb1ec93798183a28 )

实现双按钮单元的最简单方法是使用CompositeCell; 它要求将子单元格渲染为兄弟元素(<span>默认使用 s,下面的示例会覆盖渲染以使用<div>s 以便您的按钮将每个按钮堆叠在自己的行上)。

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

(注意:在你的情况下,因为按钮的文本不依赖于行对象,也许你应该使用一个ActionCell; 它会更好地“语义上”适合你正在做的事情,但除此之外它几乎是一样的; 与ActionCell,您将使用HasCell<AdminModel, AdminModel>, ActionCell<AdminModel>getFieldUpdater将按原样返回null, and thegetValue of theHasCell would just return theAdminModel` 参数)。

否则,完全由您自己实现您的Cell(或)。AbstractCell

于 2014-06-09T13:22:06.597 回答