Добавление события Double Click в ячейке CellTable - GWT
Я не могу понять, как добавить событие двойного щелчка в ячейку CellTable.
Возможно ли это с помощью GWT CellTable или нет?
Есть ли способ обхода
спасибо..
ал
Кстати, я видел этот пост, но ответа нет...
http://www.devcomments.com/Adding-DoubleClicks-and-OnContextMenu-to-CellTable-at1066168.htm
Ответы
Ответ 1
Я создал нечто другое, которое просто соответствовало моим потребностям:
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
cellTable.addDomHandler(new DoubleClickHandler() {
@Override
public void onDoubleClick(DoubleClickEvent event) {
Window.alert("That it!");
}
}, DoubleClickEvent.getType());
Ответ 3
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());
Ответ 4
Поскольку интерфейс 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 тоже хорошо работает, однако иногда у вас действительно нет пользовательских ячеек или вы хотите, чтобы пользовательская ячейка просто обрабатывала события в ячейке.
Ответ 5
Для списков ячеек этот код работает нормально:
cellList.addDomHandler(new DoubleClickHandler() {
@Override
public void onDoubleClick(DoubleClickEvent event) {
// do the stuff
}
}, DoubleClickEvent.getType());
Я не уверен в ячейках таблицы
Ответ 6
Если вам нужна текстовая ячейка, которая позволяет вам поддерживать свой выбранный список событий, вы можете использовать это:
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() для обработки ваших событий.