2011-01-27 77 views

回答

-1

如果你想要一个文本你可以使用这个:

public class EventfulTextCell extends AbstractSafeHtmlCell`<String`> { 

    private static final String[] NO_CONSUMED_EVENTS = null; 

    public EventfulTextCell() { 
     this(NO_CONSUMED_EVENTS); 
    } 

    public EventfulTextCell(String... consumedEvents) { 
     super(SimpleSafeHtmlRenderer.getInstance(), consumedEvents); 
    } 

    @Override 
    public void render(Context context, SafeHtml value, SafeHtmlBuilder sb) { 
     if (value != null) { 
      sb.append(value); 
     } 
    } 
} 

然后,你实例化它:

new EventfulTextCell("click", "dblclick") 

然后覆盖onBrowserEvent()方法来处理您的事件。

+0

这是国际海事组织的做事混乱的方式,但它工作 – 2012-09-05 18:14:51

5

我制作不同的东西,只是适合我的需要:

cellTable.addCellPreviewHandler(new Handler<TitoloProxy>() { 

      long lastClick=-1000; 

      @Override 
      public void onCellPreview(CellPreviewEvent<TitoloProxy> event) { 
       long clictAt = System.currentTimeMillis(); 
       GWT.log("clickAt: "+(clictAt)); 
       GWT.log("lastClick: "+(lastClick)); 
       if(event.getNativeEvent().getType().contains("click")){ 
        GWT.log(""+(clictAt-lastClick)); 
        if(clictAt-lastClick < 300) { // dblclick on 2 clicks detected within 300 ms 
         Window.alert("I am a double click crafted event!"); 

        } 
        lastClick = System.currentTimeMillis(); 
       } 
      } 
     }); 
+2

更可以使用优雅的事件类型检查来代替`event.getNativeEvent()。getType()。contains(“click”)``。尝试`Event.getTypeInt(event.getNativeEvent()。getType())== Event.ONCLICK`,用与所需事件相对应的枚举替换Event.ONCLICK`(使用GWT 2.4进行测试)。 – 2012-02-06 16:15:18

+0

这不支持parrellel中的单击事件=( – 2012-09-12 18:43:26

+0

@SuperKakes你是对的,但如果你使用Boris解决方案,你将能够区分单击和双击,如果你仍然想使用我的解决方案,你可以区分单个并双击.contains(“click”)测试,我没有尝试过, – 2012-10-11 14:29:33

5
cellTable.addDomHandler(new DoubleClickHandler() { 

     @Override 
     public void onDoubleClick(DoubleClickEvent event) { 
      Window.alert("That's it!"); 
     } 
    }, DoubleClickEvent.getType()); 
1

因为CellPreview接口本身不捕捉双击事件,你将需要添加事件逻辑到重写onCellPreview方法。首先你会认为最好的办法是检查点击时间差异。但是,使用状态机和点击次数会更加高效和优雅。这更强大,可以处理多个事件 - 例如鼠标悬停,单击和双击。代码非常简单。所以享受!

public class CellHoverHandler implements Handler<T> { 

    Timer singleClickTimer; 
    int clickCount = 0; 
    int clickDelay = 300; 

    @Override 
    public void onCellPreview(final CellPreviewEvent<T> event) { 
     if (Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONMOUSEOVER) { 
      handleOnMouseOver(event); 
     } else if (Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONCLICK) { 
      clickCount++; 
      if (clickCount == 1) { 
       singleClickTimer = new Timer() { 

        @Override 
        public void run() { 
         clickCount = 0; 
         handleOnClick(event); 
        } 
       }; 
       singleClickTimer.schedule(clickDelay); 
      } else if (clickCount == 2) { 
       singleClickTimer.cancel(); 
       clickCount = 0; 
       handleOnDblClick(event); 
      } 
     } 
    } 

    private void handleOnMouseOver(CellPreviewEvent<T> event) { 
     Element cell = event.getNativeEvent().getEventTarget().cast(); 
     GWT.log("mouse over event"); 
    } 

    private void handleOnClick(CellPreviewEvent<T> event) { 
     Element cell = event.getNativeEvent().getEventTarget().cast(); 
     GWT.log("click event"); 
    } 

    private void handleOnDblClick(CellPreviewEvent<T> event) { 
     Element cell = event.getNativeEvent().getEventTarget().cast();    
     GWT.log("double click event"); 
    } 

优化:随意将计数,计时器和延迟作为静态类成员或全局成员来重用。在创建新实例之前,还要检查计时器是否为空。为简单起见,我忽略了这一点。与许多其他技术不同,这种方式仍然可以让您轻松直接访问单元格事件。重载AbstractCell的技术也很有效,但是有时候你实际上没有定制单元,或者想要定制单元来处理单元上的事件。

2
Integer row=0;// to hold row index 
Integer column=0;// to hold column index 
_Grid.addCellPreviewHandler(new CellPreviewEvent.Handler<Model>() { 
// this is to handle row id 
     @Override 
     public void onCellPreview(final CellPreviewEvent<Model> event) { 

      if (BrowserEvents.CLICK.equalsIgnoreCase(event.getNativeEvent().getType())) { 
       row = event.getIndex(); 
       column=event.getColumn(); 
      } 

     } 
    }); 

// because Doubleclick handler doesn't give row index or column index we will use addCellPreviewHandler to return row index or column index. 
_Grid.addDomHandler(new DoubleClickHandler() { 

     @Override 
     public void onDoubleClick(final DoubleClickEvent event) { 
      System.out.println(" You clicked row = " + row); 
      System.out.println(" You clicked column = " + column); 

     } 
    }, DoubleClickEvent.getType()); 
1

对于小区列表,此代码的工作确定:

cellList.addDomHandler(new DoubleClickHandler() { 
    @Override 
    public void onDoubleClick(DoubleClickEvent event) { 
     // do the stuff 
    } 
    }, DoubleClickEvent.getType()); 

我不知道有关表格单元格

相关问题