【问题标题】:adding Double click event in CellTable cell - GWT在 CellTable 单元格中添加双击事件 - GWT
【发布时间】:2011-06-16 11:32:27
【问题描述】:

我无法弄清楚如何将双击事件添加到 CellTable 的单元格中。

GWT CellTable 是否可行?

有什么办法吗

谢谢你..

al

顺便说一句,我看到了这个帖子,但没有回复...... http://www.devcomments.com/Adding-DoubleClicks-and-OnContextMenu-to-CellTable-at1066168.htm

【问题讨论】:

    标签: events gwt cell double-click


    【解决方案1】:

    将此留在这里以备将来参考

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

    dblClickHandlers 只是映射我选择的接口实现

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

    诀窍是接收 'dblclick' 事件。

    【讨论】:

      【解决方案2】:

      由于 CellPreview 接口本身不捕获双击事件,您需要将事件逻辑添加到 Overriden 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 的技术也很有效,但是有时您确实没有自定义单元格,或者想要制作一个自定义单元格来处理单元格上的事件。

      【讨论】:

        【解决方案3】:

        对于单元格列表,此代码可以正常工作:

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

        我不确定表格单元格

        【讨论】:

          【解决方案4】:
          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());
          

          【讨论】:

          • 在我们的例子中,我们已经在跟踪选择上下文,因此以这种方式添加处理程序效果很好,而且很好且无创。它适用于网格选择模型以及 onCellPreview。
          【解决方案5】:
              cellTable.addDomHandler(new DoubleClickHandler() {
          
                  @Override
                  public void onDoubleClick(DoubleClickEvent event) {
                      Window.alert("That's it!");
                  }
              }, DoubleClickEvent.getType());
          

          【讨论】:

          • 您将无法使用这种方式访问​​单元格或单元格表数据,例如行索引或列索引。
          • 如果用户单击 CellTable 上的任何位置,包括标题或未填充行的空白区域,此处理程序将触发。我不认为这是个好主意。
          【解决方案6】:

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

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

          【讨论】:

          • 可以进行更优雅的事件类型检查,而不是event.getNativeEvent().getType().contains("click")。尝试Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONCLICK,将Event.ONCLICK 替换为与所需事件相对应的枚举(使用 GWT 2.4 测试)。
          • 这不支持parrellel中的单击事件=(
          • @SuperKakes 你是对的,但如果你使用 Boris 解决方案,你将能够区分单击和双击。如果您仍然想使用我的解决方案,您可以在 .contains("click") 测试中区分单击和双击。我没有试过你。
          【解决方案7】:

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

          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() 方法来处理你的事件。

          【讨论】:

            猜你喜欢
            • 2012-03-05
            • 1970-01-01
            • 1970-01-01
            • 2012-07-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-03
            • 2011-03-16
            • 1970-01-01
            相关资源
            最近更新 更多