0

celltable に画像を追加したいので、以下のように imageResouce を使用します

         interface Resources extends ClientBundle {
         @Source("close.png")
         ImageResource getImageResource();
          }

         Resources resources = GWT.create(Resources.class);

         deleteJobColumn = new Column<EmployerJobs, ImageResource>(new ImageResourceCell()) {
        @Override
        public ImageResource getValue(EmployerJobs object) {
              return resources.getImageResource();
        }
    };

完全に正常に動作し、セルテーブルに画像を取得していますが、その画像にクリックハンドラーを追加したいので、以下のようにフィールドアップデーターを使用しています

         display.getListJobsWidget().getDeleteJobColumn().setFieldUpdater(

            new FieldUpdater<EmployerJobs, ImageResource>() {

                public void update(int index, EmployerJobs employerJobs,
                        ImageResource value) {

                                       Window.alert("Hello");

                }
            });

そのため、上の画像セルをクリックすると、「こんにちは」と表示されますが、何もしていません..任意の解決策..

ありがとう

4

2 に答える 2

2

ImageResourceCellを呼び出すための配線はありませんValueUpdater。画像を描画してそれを使用するように設計されています。

これを変更する方法はいくつかあります。

  • ImageResourceCellonBrowserEventをサブクラス化してオーバーライドします-ButtonCellこれがどのように機能するかを確認してください
  • 代わりに、次のような別のセルクラスを使用しActionCellます。これはクライアントからデータを取得しませんが、クリックされたときに実行されるデリゲートisnteadを渡すことができます。コンストラクターを使用してActionCell(SafeHtml,Delegate<C>)、画像をhtmlの形式で渡します
  • 新しいセルを作成し、サブクラス化AbstractCellして、レンダリングコードをから借用しImageResourceCell、イベントコードをから借用して、コードを可能な限り一般的で再利用可能な状態に保ちますButtonCellActionCell
于 2012-01-05T22:13:58.530 に答える
1

Colin によって提供された最初のソリューションの例。getConsumedEvents をオーバーライドするのは少し難しいと思いましたが、うまく機能しているようです。

public class ClickableImageResourceCell extends ImageResourceCell{
        public ClickableImageResourceCell(){
            super();
        }
        @Override
        public Set<String> getConsumedEvents() {
            Set<String> set = new HashSet<String>();
            set.add("click");
            return set;
        }
        @Override
        public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context, Element parent, ImageResource value, NativeEvent event, ValueUpdater<ImageResource> valueUpdater) {
            super.onBrowserEvent(context, parent, value, event, valueUpdater);
             if ("click".equals(event.getType())) {
                EventTarget eventTarget = event.getEventTarget();
                if (!Element.is(eventTarget)) {
                    return;
                }
                if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
                    // Ignore clicks that occur outside of the main element.
                    keyDown(context, parent, value, event, valueUpdater);
                }
            }

        }

          protected void keyDown(Context context, Element parent, ImageResource value,
              NativeEvent event, ValueUpdater<ImageResource> valueUpdater) {
            if (valueUpdater != null) {
              valueUpdater.update(value);
            }
          }
}
于 2012-06-29T01:42:06.697 に答える