在GWT celltable中添加超链接

时间:2012-01-28 07:33:52

标签: gwt

我正在尝试在celltable中添加超链接,并在点击该链接时要调用方法。

使用下面的代码我正确地在我的单元格中获得了一个超链接但我无法通过单击链接来调用方法,当我单击链接时,它将我带到上一页。

任何解决方案

Hyperlink link = new Hyperlink("Delete","");

Column<EmployerJobs, Hyperlink> linkColumn = 
    new Column<EmployerJobs, Hyperlink>(new HyperLinkCell()) { 
      @Override 
      public Hyperlink getValue(EmployerJobs list) {
        link.addClickHandler(new ClickHandler() {
          public void onClick(ClickEvent event) {
            deleteJobs(list);
          }
        });
        return link; 
      }
});

3 个答案:

答案 0 :(得分:8)

您可以使用ClickableTextCell,ButtonCell或ActionCell代替HyperlinkCell。

<强> ClickableTextCell

Column<EmployerJobs, String> linkColumn = 
    new Column<EmployerJobs, String>(new ClickableTextCell())  {
         @Override
         public String getValue(EmployerJobs object)  {
             return TEXT_TO_DISPLAY;
         }
    },'linkheadertext');
linkColumn.setFieldUpdater(new FieldUpdater<EmployerJobs, String>() {
         @Override
         public void update(int index, EmployerJobs object, String value) {
             deleteJobs(object);
         }
});

<强>扣式

Column<EmployerJobs, String> buttonColumn = 
    new Column<EmployerJobs, String>(new ButtonCell())  {
         @Override
         public String getValue(EmployerJobs object)  {
             return TEXT_TO_DISPLAY;
         }
    },'linkheadertext');
buttonColumn.setFieldUpdater(new FieldUpdater<EmployerJobs, String>() {
         @Override
         public void update(int index, EmployerJobs object, String value) {
             deleteJobs(object);
         }
});

<强> ActionCell

Column<EmployerJobs, EmployerJobs> actionColumn = 
    new Column<EmployerJobs, EmployerJobs>(new ActionCell<EmployerJobs>("Click Me",
        new ActionCell.Delegate<EmployerJobs>() {
            @Override
            public void execute(EmployerJobs jobs) {
                deleteJobs(jobs);
            }
        })
    {
         @Override
         public EmployerJobs getValue(EmployerJobs object)  {
             return object;
         }
    },'linkheadertext');

查看CellSample showcase以获取更多信息。

答案 1 :(得分:3)

我在类似的帖子上发表了我的回答: How can I render a ClickableTextCell as an anchor in a GWT CellTable? 但对于那个为这个帖子添加书签的人: 这就是你需要的

public class ClickableSafeHtmlCell extends AbstractCell<SafeHtml> {
/**
 * Construct a new ClickableSafeHtmlCell.
 */
public ClickableSafeHtmlCell() {
    super("click", "keydown");
}

@Override
public void onBrowserEvent(Context context, Element parent, SafeHtml value, NativeEvent event,
        ValueUpdater<SafeHtml> valueUpdater) {
    super.onBrowserEvent(context, parent, value, event, valueUpdater);
    if ("click".equals(event.getType())) {
        onEnterKeyDown(context, parent, value, event, valueUpdater);
    }
}

@Override
protected void onEnterKeyDown(Context context, Element parent, SafeHtml value,
        NativeEvent event, ValueUpdater<SafeHtml> valueUpdater) {
    if (valueUpdater != null) {
        valueUpdater.update(value);
    }
}

@Override
public void render(Context context, SafeHtml value, SafeHtmlBuilder sb) {
    if (value != null) {
        sb.append(value);
    }
}

然后用法:

Column<YourProxy, SafeHtml> nameColumn = new Column<YourProxy, SafeHtml>(
        new ClickableSafeHtmlCell()) {
    @Override
    public SafeHtml getValue(YourProxy object) {
        SafeHtmlBuilder sb = new SafeHtmlBuilder();
        sb.appendHtmlConstant("<a>");
        sb.appendEscaped(object.getName());
        sb.appendHtmlConstant("</a>");
        return sb.toSafeHtml();
    }
};

nameColumn.setFieldUpdater(new FieldUpdater<YourProxy, SafeHtml>() {
        @Override
        public void update(int index, YourProxy object, SafeHtml value) {
             Window.alert("You have clicked: " + object.getName());

        }
    });

答案 2 :(得分:1)

如上面的答案所示,您可以在需要进行内部编辑时使用更新程序。但是,如果要捕获单击以执行某些操作,可以使用ClickableTextCell执行此操作。

ClickableTextCell employerJobsCell = new ClickableTextCell();

Column<EmployerJobs, String> employerJobsColumn = new Column<EmployerJobs, String>(employerJobsCell) {    
    @Override
    public String getValue(EmployerJobs object) {
        return object.getWhichStringToDisplay();
    }

    @Override
    public void render(Context context, EmployerJobs object, SafeHtmlBuilder sb) {
        //this method is optional, can be used if the display needs to be customized
    }

    @Override
    public void onBrowserEvent(Context context, Element elem, EmployerJobs object, NativeEvent event) {
        super.onBrowserEvent(context, elem, object, event);

        Event evt = Event.as(event);
        int eventType = evt.getTypeInt();
        if (eventType == Event.ONCLICK) {
            //call delete job when cell is clicked
            deleteJobs(object);
        }
    }
};

dataGrid.addColumn(employerJobsColumn,“标题在这里”);