Events 在CellTable单元格中添加双击事件-GWT

Events 在CellTable单元格中添加双击事件-GWT,events,gwt,cell,double-click,Events,Gwt,Cell,Double Click,我不知道如何将双击事件添加到CellTable的单元格中 是否可以使用GWT CellTable 有什么解决办法吗 谢谢 艾尔 顺便说一句,我看到了这篇文章,但没有回复。。。 如果您想要一个文本单元格,允许您支持自己选择的事件列表,您可以使用以下内容: public class EventfulTextCell extends AbstractSafeHtmlCell`<String`> { private static final String[] NO_CONSUMED

我不知道如何将双击事件添加到CellTable的单元格中

是否可以使用GWT CellTable

有什么解决办法吗

谢谢

艾尔

顺便说一句,我看到了这篇文章,但没有回复。。。

如果您想要一个文本单元格,允许您支持自己选择的事件列表,您可以使用以下内容:

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

然后重写onBrowserEvent()方法来处理您的事件。

我制作了一些不同的东西来满足我的需要:

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();
               }
           }
       });
cellTable.addCellPreviewHandler(新处理程序(){
长时间点击=-1000;
@凌驾
公共void onCellPreview(CellPreviewEvent事件){
long clictAt=System.currentTimeMillis();
log(“clickAt:”+(clictAt));
log(“lastClick:+(lastClick));
如果(event.getNativeEvent().getType()包含(“单击”)){
log(“+(clictAt lastClick));
如果(clictAt lastClick<300){//dblclick在300毫秒内检测到2次点击
警告(“我是一个双击精心制作的事件!”);
}
lastClick=System.currentTimeMillis();
}
}
});

由于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");
    }
公共类CellHoverHandler实现处理程序{
定时器单点定时器;
int clickCount=0;
int clickDelay=300;
@凌驾
public void onCellPreview(最终CellPreviewEvent事件){
if(Event.getTypeInt(Event.getNativeEvent().getType())==Event.ONMOUSEOVER){
手持鼠标(事件);
}else if(Event.getTypeInt(Event.getNativeEvent().getType())==Event.ONCLICK){
点击计数++;
如果(单击计数=1){
singleClickTimer=新建计时器(){
@凌驾
公开募捐{
点击计数=0;
点击(事件);
}
};
singleClickTimer.schedule(单击延迟);
}否则如果(单击计数==2){
singleClickTimer.cancel();
点击计数=0;
handleOnDblClick(事件);
}
}
}
私有无效handleOnMouseOver(CellPreviewEvent事件){
元素单元格=event.getNativeEvent().getEventTarget().cast();
GWT.log(“鼠标悬停事件”);
}
private void handleOnClick(CellPreviewEvent事件){
元素单元格=event.getNativeEvent().getEventTarget().cast();
GWT.log(“点击事件”);
}
私有void handleOnDblClick(CellPreviewEvent事件){
元素单元格=event.getNativeEvent().getEventTarget().cast();
GWT.log(“双击事件”);
}
优化:可以将计数、计时器和延迟作为静态类成员或全局成员进行重用。在创建新实例之前,还可以检查计时器是否为空。为了简单起见,我省略了这一点。与许多其他技术不同,这种方法仍然为您提供对单元格事件的简单直接访问。使用ov加载AbstractCell也可以很好地工作,但是有时您确实没有自定义单元格,或者希望创建一个自定义单元格来处理单元格上的事件。

Integer row=0;//保存行索引
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());
整型列=0;//用于保存列索引 _addCellPreviewHandler(新的CellPreviewEvent.Handler(){ //这是为了处理行id @凌驾 public void onCellPreview(最终CellPreviewEvent事件){ if(BrowserEvents.CLICK.equalsIgnoreCase(event.getNativeEvent().getType())){ row=event.getIndex(); column=event.getColumn(); } } }); //由于双击处理程序不提供行索引或列索引,我们将使用addCellPreviewHandler返回行索引或列索引。 _addDomHandler(新的DoubleClickHandler(){ @凌驾 公共无效onDoubleClick(最终DoubleClickEvent事件){ System.out.println(“您单击了row=“+row”); System.out.println(“您单击了column=“+column”); } },DoubleClickEvent.getType());
对于单元格列表,此代码正常工作:

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

我不确定是否将表格单元格留在这里以供将来参考

    private Set<GenericEventHandler<T>> dblClickHandlers = new HashSet<>(4);

诀窍是取消“dblclick”事件。

可以执行更优雅的事件类型检查,而不是
event.getNativeEvent().getType().contains(“单击”)
。尝试
event.getTypeInt(event.getNativeEvent().getType())==Event.ONCLICK
,用对应于所需事件(使用GWT 2.4测试)的枚举替换
Event.ONCLICK
。这不支持Parrelell中的单击事件=(@SuperKakes您是对的,但是如果您使用Boris解决方案,您将能够区分单击和双击。如果您仍然要使用我的解决方案,您可以在.contains(“单击”)中区分单击和双击测试。我没有尝试过。您将无法使用这种方式访问单元格或单元格表数据,例如行索引或列索引。如果用户单击单元格表上的任何位置,包括未填充行的标题或空白,将触发此处理程序。我认为这不是一个好主意。在我们的示例中,我们已经在跟踪选择内容t、 因此,以这种方式添加处理程序非常有效,而且非常好,而且是非侵入性的。它也适用于grid SelectionModels
  cellList.addDomHandler(new DoubleClickHandler() {
    @Override
    public void onDoubleClick(DoubleClickEvent event) {
      // do the stuff
    }
  }, DoubleClickEvent.getType());
    private Set<GenericEventHandler<T>> dblClickHandlers = new HashSet<>(4);
    table.addCellPreviewHandler(event -> {
        if (BrowserEvents.DBLCLICK.equalsIgnoreCase(event.getNativeEvent().getType())) {
            LOGGER.info("dblclick (native) " + event.getIndex() + "  " + event.getColumn() + "; " + event.getValue());
            dblClickHandlers.forEach(handler -> {
                handler.onEvent(event.getValue());
            });
        }
    });
    table.sinkBitlessEvent(BrowserEvents.DBLCLICK);