gwt:将clickhandler添加到ImageResource单元格

时间:2012-01-05 13:56:10

标签: gwt gwt-celltable

我想将图像添加到我的手机中,因为我使用imageResouce,如下所示

         interface Resources extends ClientBundle {
         @Source("close.png")
         ImageResource getImageResource();
          }

         Resources resources = GWT.create(Resources.class);

         deleteJobColumn = new Column<EmployerJobs, ImageResource>(new ImageResourceCell()) {
        @Override
        public ImageResource getValue(EmployerJobs object) {
              return resources.getImageResource();
        }
    };

它的工作非常好,我在我的手机中获取图像但现在我想将clickhandler添加到该图像,为此我正在使用如下的字段更新器

         display.getListJobsWidget().getDeleteJobColumn().setFieldUpdater(

            new FieldUpdater<EmployerJobs, ImageResource>() {

                public void update(int index, EmployerJobs employerJobs,
                        ImageResource value) {

                                       Window.alert("Hello");

                }
            });

所以现在当我点击上面的图像单元格时,它应该说“你好”,但它没有做任何事情..任何解决方案..

谢谢

2 个答案:

答案 0 :(得分:2)

ImageResourceCell没有任何线路可以调用ValueUpdater,它只是用来绘制图像并完成它。

您可以通过以下几种方式更改此内容:

  • 子类ImageResourceCell并覆盖onBrowserEvent - 查看ButtonCell以查看其如何运作
  • 使用不同的单元格类,例如ActionCell - 这不会从客户端获取任何数据,但会允许您传入委托isntead,这将在单击该东西时运行。使用ActionCell(SafeHtml,Delegate<C>)构造函数以html
  • 的形式传入您的图片
  • 构建一个新单元格,继承AbstractCell,借用ImageResourceCell中的呈现代码和ButtonCellActionCell中的事件代码,使代码保持通用性并可重复使用可能的。

答案 1 :(得分:0)

Colin提供的第一个解决方案的示例。我发现覆盖getConsumedEvents有点棘手,但似乎运行良好。

public class ClickableImageResourceCell extends ImageResourceCell{
        public ClickableImageResourceCell(){
            super();
        }
        @Override
        public Set<String> getConsumedEvents() {
            Set<String> set = new HashSet<String>();
            set.add("click");
            return set;
        }
        @Override
        public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context, Element parent, ImageResource value, NativeEvent event, ValueUpdater<ImageResource> valueUpdater) {
            super.onBrowserEvent(context, parent, value, event, valueUpdater);
             if ("click".equals(event.getType())) {
                EventTarget eventTarget = event.getEventTarget();
                if (!Element.is(eventTarget)) {
                    return;
                }
                if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
                    // Ignore clicks that occur outside of the main element.
                    keyDown(context, parent, value, event, valueUpdater);
                }
            }

        }

          protected void keyDown(Context context, Element parent, ImageResource value,
              NativeEvent event, ValueUpdater<ImageResource> valueUpdater) {
            if (valueUpdater != null) {
              valueUpdater.update(value);
            }
          }
}