Обработчик событий DoubleClick для GWT Grid - PullRequest
2 голосов
/ 21 сентября 2011

Я использую сетку gwt, и я пытаюсь получить ячейку, на которой было событие onDoubleClick. Поэтому, если бы я делал onClickEvent, я бы использовал getCellForEvent (ClickEvent), и это возвращает ячейку. Но этот метод не принимает DoublClickEvent. Как мне получить ячейку с onDoubleClick ...?

Ответы [ 3 ]

1 голос
/ 21 сентября 2011

Я не думал об этом 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 выбирается, если вы не запретите это поведение по умолчанию.

Я не эксперт, и я хотел бы получить совет от людей о том, могу ли я сделать это лучше. Но это работает, поэтому я предлагаю в качестве возможного ответа.

1 голос
/ 21 сентября 2011

Расширьте Grid и используйте защищенный getEventTargetCell, чтобы получить ячейку из NativeEvent вместо GwtEvent.

0 голосов
/ 24 января 2012

Вам нужно будет расширить исходную ячейку. В конструкторе изменить:

super("click", "keyup", "keydown", "blur"); до super("dblclick", "keyup", "keydown", "blur");

и изменение метода onBrowserEvent:

if ("click".equals(type) || enterPressed) до if ("dblclick".equals(type) || enterPressed)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...