Как заставить слушателя работать в CellColumn getValue gwt?

Мое требование состоит в том, чтобы сделать столбец как комбинацию текста и гиперссылки. Следовательно, я не могу использовать ClickableTextCell, Для этого я сделал следующее:

private final Column < Trap, Widget > elementColumn = new Column < Trap, Widget > (new WidgetCell()) {
 @Override
 public Widget getValue(Trap trap) {
     Label label = null;
     Anchor anchor = null;

     if (trap.getNode() != null) {
         label = new InlineLabel(EmsEntryPoint.getMessagesInstance().device() + ": ");

         String name = trap.getNode().getName();
         if (name == null || name.isEmpty()) {
             name = DataConverter.convertLongToHexId(trap.getNode().getId());
         }

         final Map < String, String > params = new HashMap < String, String > ();
         params.put(NetworkActivity.PARAM_NODE_ID, String.valueOf(trap.getNode().getId()));
         anchor = new Anchor(name);
         anchor.addClickHandler(new ClickHandler() {

             @Override
             public void onClick(ClickEvent event) {
                 NodeDetail nodeDetail = new NodeDetail(mInjector, UrlHelper.getPlaceToken(null, params));
                 bindNodeDetailButtons(nodeDetail);
                 nodeDetail.showNodeDetailPopup();
             }
         });
     }
     FlowPanel panel = new FlowPanel();
     panel.add(label);
     panel.add(anchor);
     return panel;
 }
}

В моем коде все правильно, но я не знаю почему AnchorСлушатель не работает. Пожалуйста, помогите.

1 ответ

Решение

Вам придется переопределить метод рендеринга и добавить обработчики в вашу ячейку.

Я использовал следующий класс:

abstract class CustomCell extends AbstractCell<String>{

    private MyObject object;
    private Set<String> set ;

    @Override
    public Set<String> getConsumedEvents() {
        set = new HashSet<String>();
        set.add("click");
        return set;
    }

    public void setObject(MyObject object) {
        this.object = object;

    }

    @Override
    public void render(com.google.gwt.cell.client.Cell.Context context,
            String value, SafeHtmlBuilder sb) {
        sb.appendHtmlConstant("<div><label>"+object.getLabel()+"</label><a id='idofthislelement'>"+object.getAnchor()+"</a></div>");
    }

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

        if ("click".equals(event.getType())) {
            EventTarget eventTarget = (EventTarget) event.getEventTarget();
            Element targetElement = Element.as(eventTarget);
            if (parent.getFirstChildElement().isOrHasChild(targetElement)&&targetElement.getId().equals("idofthislelement")) {
                doAction(value, valueUpdater,object);
            }
        }
    }

    protected abstract void doAction(String value, ValueUpdater<String> valueUpdater,MyObject object);

}

Вот реализация:

private void createTextAnchorCol() {
    final CustomCell<MyObject> cell = new CustomCell<MyObject>() {

        @Override
        protected void doAction(String value,
                ValueUpdater<String> valueUpdater, MyObject object) {
            Window.alert("Clicked");
            //do whatever required
        }
    };
    Column<MyObject, String> abc = new Column<MyObject, String>(cell) {

        @Override
        public String getValue(MyObject object) {
            cell.setObject(object);
            return null;
        }
    };
Другие вопросы по тегам