Я не думал об этом NativeEvent. Я надеюсь, что он переносим во всех браузерах. Моя DataGrid имеет расширение ClickableTextCells. DClickableTextCell («D» для двойного щелчка) реагирует на двойной щелчок, который Microsoft определяет как два щелчка в течение 500 миллисекунд.
public class DClickableTextCell extends ClickableTextCell {
@Override
public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context, Element parent,
String value, NativeEvent event, ValueUpdater<String> valueUpdater) {
String type = event.getType();
if ((valueUpdater != null) && type.equals("click")) {
if (DoubleClickTimer.getInstance().isTimerRunning()) {
event.preventDefault();
DoubleClickTimer.getInstance().stopTimer();
valueUpdater.update(value);
} else {
DoubleClickTimer.getInstance().startTimer();
}
}
}
}
Если таймер DoubleClick в данный момент работает, то этот щелчок должен повторяться при двойном щелчке. Если таймер DoubleClick в данный момент не работает, то это потенциально первый щелчок DoubleClick. Запустите таймер. Вот код для DoubleClickTimer:
public class DoubleClickTimer {
private static DoubleClickTimer ref = null;
private DoubleClickTimer() {
}
public static DoubleClickTimer getInstance() {
if (ref == null) {
ref = new DoubleClickTimer();
}
return ref;
}
private boolean timerRunning = false;
private Timer timer = new Timer() {
@Override
public void run() {
timerRunning = false;
}
};
public void startTimer() {
if (!timerRunning) {
timer.schedule(500);
timerRunning = true;
}
}
public boolean isTimerRunning() {
return timerRunning;
}
public void stopTimer() {
timer.cancel();
timerRunning = false;
}
}
Это работает, но теперь я собираюсь взглянуть на расширение DataGrid. Проблема в том, что DataGrid ссылается на защищенные методы в AbstractCellTable, которые недоступны, как только вы поместите свой подкласс DataGrid в другой пакет. Вы также можете перенести AbstractCellTable, но затем он делает аналогичные ссылки, и в итоге вы копируете больше материала.
Вызов в event.preventDefault подавляет обычное поведение двойного щелчка, то есть для выделения виджета, по которому щелкают. Поскольку вся DataGrid представляет собой один виджет (ячейки и столбцы не являются виджетами), каждый бит текста в DataGrid выбирается, если вы не запретите это поведение по умолчанию.
Я не эксперт, и я хотел бы получить совет от людей о том, могу ли я сделать это лучше. Но это работает, поэтому я предлагаю в качестве возможного ответа.