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

12
7个回答

5
    cellTable.addDomHandler(new DoubleClickHandler() {

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

您将无法使用此方法访问单元格或单元格表数据,例如行索引或列索引。 - 1-14x0r
如果用户在CellTable上的任何位置(包括标题或未填充行的空白空间)单击,此处理程序将触发。我认为这不是一个好主意。 - Andrei Volgin

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

3
可以使用更加优雅的事件类型检查方法,而不是 event.getNativeEvent().getType().contains("click")。尝试使用 Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONCLICK 进行替换,将 Event.ONCLICK 替换为对应所需事件的枚举值(在 GWT 2.4 中测试通过)。 - Boris Brudnoy
这不支持并行的单击事件 =( - 1-14x0r
@SuperKakes,你说得没错,但是如果你使用Boris的解决方案,你将能够区分单击和双击。如果你仍然想使用我的解决方案,你可以在.contains("click")测试中区分单击和双击。不过我还没有尝试过。 - Christian Achilli

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

在我们的情况下,我们已经跟踪了选择上下文,因此以这种方式添加处理程序非常有效,并且很好而且不会影响其他功能。它可以与网格选择模型以及单元格预览一起使用。 - Rod McChesney

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的技术也很好,但有时您确实没有自定义单元格或只想创建一个自定义单元格来处理单元格上的事件。


1
对于单元格列表,这段代码可以正常工作:
  cellList.addDomHandler(new DoubleClickHandler() {
    @Override
    public void onDoubleClick(DoubleClickEvent event) {
      // do the stuff
    }
  }, DoubleClickEvent.getType());

我不确定表格单元格


0

把这个留在这里以备将来参考

    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”事件降低。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接