2011-09-21 90 views
2

我正在使用gwt网格,并试图获取其上有onDoubleClick事件的单元。所以,如果我在做onClickEvent,我会使用getCellForEvent(ClickEvent)并返回一个单元格。但是该方法不接受DoublClickEvent。我如何获得具有onDoubleClick ...的单元格?GWT Grid的DoubleClick事件处理程序

回答

1

延伸Grid并使用受保护的getEventTargetCellNativeEvent而不是GwtEvent获得单元格。

+0

你说的一个NativeEvent是什么意思?对不起,我新来这个东西... – gwtUser

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中的每一行文本都会被选中,除非您阻止该默认行为。

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

0

您需要扩展原始单元格。在构造变化:

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

,并在onBrowserEvent方法改变:

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