добавление события двойного щелчка в ячейку CellTable - GWT - PullRequest
12 голосов
/ 27 января 2011

Я не могу понять, как добавить событие двойного щелчка в ячейку CellTable.

Возможно ли это с GWT CellTable или нет?

Есть ли обходной путь

спасибо ..

ал

Кстати, я видел это сообщение, но ответа нет ... http://www.devcomments.com/Adding-DoubleClicks-and-OnContextMenu-to-CellTable-at1066168.htm

Ответы [ 7 ]

5 голосов
/ 23 марта 2012
    cellTable.addDomHandler(new DoubleClickHandler() {

        @Override
        public void onDoubleClick(DoubleClickEvent event) {
            Window.alert("That's it!");
        }
    }, DoubleClickEvent.getType());
5 голосов
/ 08 ноября 2011

Я создал что-то другое, что просто соответствует моим потребностям:

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 голосов
/ 10 января 2013
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 голос
/ 09 октября 2013

Для списков ячеек этот код работает нормально:

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

Я не уверен насчет ячеек таблицы

1 голос
/ 12 сентября 2012

Поскольку интерфейс 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 тоже работает хорошо, однако иногда у вас действительно нет пользовательских ячеек или вы хотите создать собственную ячейку для обработки событий в ней.

0 голосов
/ 14 августа 2018

Оставив это здесь для дальнейшего использования

    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'.

0 голосов
/ 18 мая 2011

Если вам нужна текстовая ячейка, которая позволяет поддерживать выбранный вами список событий, вы можете использовать это:

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 () для обработки ваших событий.

...