GWT网格的DoubleClick事件处理程序

时间:2011-09-21 16:27:15

标签: java gwt onclick

我正在使用gwt网格,我试图获取其上有onDoubleClick事件的单元格。因此,如果我正在使用onClickEvent,我将使用getCellForEvent(ClickEvent)并返回一个单元格。但该方法不接受DoublClickEvent。如何获得具有onDoubleClick的单元格??

3 个答案:

答案 0 :(得分:1)

扩展Grid并使用受保护的getEventTargetCellNativeEvent而不是GwtEvent获取单元格。

答案 1 :(得分:1)

我没想到那个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中的每个文本都会被选中。

我不是专家,我想从人们那里得到关于我是否能做得更好的建议。但它有效,所以我提供它作为一个可能的答案。

答案 2 :(得分:0)

您需要扩展原始单元格。在构造函数中更改:

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

并在onBrowserEvent方法中更改:

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