2011-08-03 103 views
6

我們的要求是讓使用CellTable含自定義部件在其細胞可編輯網格。自定義小部件具有與文本框關聯的文本框和搜索按鈕。要將自定義小部件添加爲單元格,創建了AbstractEditableCell類的子類(由GWT提供),並覆蓋了render()onBrowserEvent()方法。GWT:在添加自定義小部件celltable定製的丟失事件部件

自定義窗口小部件單元的render(Context context, String value, SafeHtmlBuilder sb)方法創建一個widget的安全html和到細胞使這個安全HTML。但我面臨的問題是,自定義小部件呈現正確,但它失去了其同事事件。下面給出的渲染方法:

if (viewData.isEditing()) { 
    textBoxSelector.setText(text); 
    OnlyToBeUsedInGeneratedCodeStringBlessedAsSafeHtml safeHtmlObj = new OnlyToBeUsedInGeneratedCodeStringBlessedAsSafeHtml(textBoxSelector.toString()); 
    sb.append(safeHtmlObj); 
} else { 
    // The user pressed enter, but view data still exists. 
    sb.append(html); 
} 

如果我嘗試使用下面的代碼添加小部件在render()方法,它不會添加的窗口小部件。

int left = parent.getAbsoluteLeft(); 
    int top = parent.getAbsoluteTop(); 
    String elementId = "ID" + left + top; 
    try { 
     parent.setId(elementId); 
     // parent.removeFromParent(); 
     RootPanel.get(elementId).add(textBoxSelector); 
    } catch (AssertionError error) { 
     RootPanel.get(elementId).add(textBoxSelector); 
    } 

我會很感激,如果任何人都可以指導我在實現另外的部件在CellTable沒有失去它的相關事件。

回答

5

GWT的細胞與GWT部件不兼容。這意味着你不能將GWT小部件放置在單元格內並使其仍然有效。細胞是有一個替代的事件處理機制,但(下面介紹)

這樣做的原因是,細胞是接近無國籍渲染器。給定一個數據對象,Cell將吐出HTML。單個Cell將被重複使用 - 爲頁面上的各種元素吐出HTML - 並且永遠不會保留對其創建的任何DOM元素的引用。

在你上面的例子中,你叫 「someWidget.toString()」。這樣做只會返回小部件的HTML表示,並且會導致事件處理失敗。

在細胞

GWT Dev Guide for Custom Cells處理事件(有一些額外的細節)

要處理的細胞活動,你需要重寫名爲onBrowserEvent一個單獨的方法。您還需要通過在您的構造函數中調用super('click', 'keydown')以及您有興趣收聽的事件列表來配置您的單元,以通知特定事件。

由於細胞是無狀態的渲染器,該onBrowserEvent會傳遞被點擊與您的單元格中呈現的原始數據對象沿着所呈現的元素的上下文。然後,您可以根據需要應用更改或操作DOM。

這裏是從上面所鏈接的開發指南採取的示例:

@Override 
public void onBrowserEvent(
    Context context, 
    Element parent, 
    String value, 
    NativeEvent event, 
    ValueUpdater<String> valueUpdater) { 

    // Let AbstractCell handle the keydown event. 
    super.onBrowserEvent(context, parent, value, event, valueUpdater); 

    // Handle the click event. 
    if ("click".equals(event.getType())) { 
    // Ignore clicks that occur outside of the outermost element. 
    EventTarget eventTarget = event.getEventTarget(); 
    if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) { 
     doAction(value, valueUpdater); 
    } 
    } 
}