2012-01-05 78 views
0

我想将图像添加到我的celltable,对于我使用imageResouce如下GWT:添加函数clickhandler到ImageResource细胞

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

其工作完全正常,我在我的celltable越来越像,但现在我想添加函数clickhandler到的图像,对于我使用现场更新像下面

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

      new FieldUpdater<EmployerJobs, ImageResource>() { 

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

             Window.alert("Hello"); 

       } 
      }); 

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

谢谢

回答

2

ImageResourceCell没有任何接线来呼叫ValueUpdater,它只是设计来绘制图像,并与它完成。

你可以改变这几个方面:

  • 子类ImageResourceCell并重写onBrowserEvent - 看看ButtonCell,看看如何能工作
  • 使用不同的细胞类,而不是像ActionCell - 这不会从客户端获取任何数据,但会让您传递委托,而不会在单击事件时运行。使用ActionCell(SafeHtml,Delegate<C>)构造函数图像通过,在HTML的形式
  • 建立一个新的细胞,继承AbstractCell,借用ImageResourceCell渲染代码,并从ButtonCellActionCell事件代码,让您的代码作为通用的,可重复使用的可能。
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); 
      } 
      } 
}