2011-08-03 17 views
6

私たちの要件は、セルにカスタムウィジェットを含むCellTableを使用して編集可能なグリッドを作成することです。カスタムウィジェットには、テキストボックスと、そのテキストボックスに関連付けられた検索ボタンがあります。カスタムウィジェットをセルとして追加するには、AbstractEditableCellクラス(GWTによって提供)のサブクラスを作成し、オーバーライドrender()およびonBrowserEvent()メソッドを持っていました。GWT:カスタムウィジェットをカスタムウィジェットの失うイベントに追加するとき

カスタムウィジェットセルのrender(Context context, String value, SafeHtmlBuilder sb)メソッドは、ウィジェットのセーフHTMLを作成し、この安全なhtmlをセルにレンダリングします。しかし、私が直面している問題は、カスタムウィジェットは正しくレンダリングされますが、そのウィジェットは関連イベントを失います。レンダリング方法は以下の通り:私は次のコードを使用してrender()方法でウィジェットを追加しようとすると、それはウィジェットを追加しません

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); 
} 

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を吐き出します。単一のセルは、ページ上のさまざまな要素に対してHTMLを何度も何度も繰り返し使用され、作成するDOM要素への参照は決して維持されません。

上記の例では、「someWidget.toString()」を呼び出します。これを行うと、あなたのウィジェットのHTML表現だけが返され、あなたのイベント処理が失われます。細胞

GWT Dev Guide for Custom Cells

イベントの処理は、(いくつかの追加の詳細を持っている)

は、細胞内でイベントを処理するために、あなたはonBrowserEventと呼ばれる別のメソッドをオーバーライドする必要があります。また、あなたはを聴いに興味があるイベントのリストにあなたのコンストラクタでsuper('click', 'keydown')を呼び出すことにより、特定のイベントが通知されるように、あなたのセルを設定する必要があります。

細胞はステートレスレンダラであるので、onBrowserEventはあなたのセルが描画元のデータ・オブジェクトと一緒にクリックされたレンダリングされた要素のコンテキストに渡されます。その後、必要に応じて変更を適用したり、DOMを操作したりすることができます。ここ

は、上記連結DEVガイドから採取した例である。

@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); 
    } 
    } 
}