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