CellTableのAbstractCellからの "クリック"のための親ウィジェットでのイベント処理

私は少しGWTのnoobだと私はこの1つの正しい方向に微妙に感謝したいと思います。

GWT 2.4の使用

CellTableを追加するEntryPointクラスのイベントをリッスンする方法を理解できません。 CellTableにはカスタムのAbstractCellがあり、ハイパーリンクで文字列をレンダリングします。セルはクリックイベントを処理します。

EntryPointクラスがイベントを処理して、何らかのアクション(CellTableを非表示にしたり、他のウィジェットを表示するなど)ができるようにするにはどうすればよいですか?

私は正常にセルとCellTableのイベントで動作することができますが、親ウィジェット(それを処理するEntryPointクラス)を取得する方法を見つけることができません。

EntryPointクラス:

public class Tags_GWT implements EntryPoint {

private final TagGwtServiceAsync tagService = GWT.create(TagGwtService.class);
final TagCellTable tagCellTable = new TagCellTable();

public void onModuleLoad() {

    RootPanel.get("tagCellTable").add(tagCellTable);

   //load the table with data
    tagService.getTagsAsList(new AsyncCallback>() {
        public void onFailure(Throwable caught) {
            GWT.log("Error loading data");
        }
        public void onSuccess(List tags) {
            tagCellTable.setInput(tags);
        }
    });

CellTableクラス:

public class TagCellTable extends CellTable{

code removed for simplicity

// Add a field updater to be notified when the user enters a new name.
nameColumn.setFieldUpdater(new FieldUpdater() {
  @Override
  public void update(int index, TagDto object, String value) {
   //Inform the user of the change.
    Window.alert("TagCellTable.update is executing for: '" + value + "'");
  }
});

AbstractCellクラス:

public class LinkCell extends AbstractCell{

code omitted for simplicity

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

  super.onBrowserEvent(context, parent, value, event, valueUpdater);

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


@Override
protected void onEnterKeyDown(Context context, Element parent, String value, NativeEvent event, ValueUpdater valueUpdater) {
  doAction(value, valueUpdater);
}


private void doAction(String value, ValueUpdater valueUpdater) {

  Window.alert("LinkCell.doAction is executing for: ' " + value + "'");

  if (valueUpdater != null) {
      valueUpdater.update(value);
  }
}
1

1 答え

私は LinkCellEventBus オブジェクトへの参照を与えなければならないと思います。次に、 doAction で、 EventBusEvent を起動できます。あなたのエントリーポイントモジュールは、関連イベントの同じ EventBus でリッスンし、そこから応答することができます。

CellTableは実際にウィジェットから作られていないため、既に組み込まれている外部コードからセルにフックする良い方法はありません。通常のウィジェットのイベント階層は決してアクティブ化されないので、リスナーを追加するものは何もありません。独自のEventBusを作成する必要があります。

1
追加された
うん!より具体的なコールバックオブジェクトを使用することもできます。
追加された 著者 Riley Lark,
しかし、私はこのアプリケーションのグローバルイベントバスを使用することを提案しませんでした。あなたは、CellにはCell専用の非常に特殊なイベントバスを与え、他のウィジェットはそのイベントバスで待機することができます。
追加された 著者 Riley Lark,
ご回答有難うございます。この記事では、 SimpleEventBus の使い方について説明しました。私はこれがあなたが提案しているものと仮定していますか?
追加された 著者 Justin,