2011-09-21 121 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)