3

我正在使用 CellTable,每当我将鼠标悬停在任何单元格上时,我都想显示一个工具提示。我的代码工作正常,但工具提示没有改变它的位置。

我的意思是,如果我将鼠标悬停在单元格 1 工具提示显示上,然后如果我将鼠标悬停在单元格 100 上,工具提示数据会更改,但工具提示仍显示在单元格 1上。

我正在使用以下代码:

cellTable.addCellPreviewHandler(new Handler<List<String>>() {
  @Override
  public void onCellPreview(CellPreviewEvent<List<String>> event) {
    if ("mouseover".equals(event.getNativeEvent().getType())) {
      Element cellElement = event.getNativeEvent().getEventTarget().cast();

      cellElement.setTitle('cell contents go here.');
    }
  }
}



任何帮助深表感谢。
谢谢。

4

5 回答 5

3

您可以扩展 Column 类并覆盖方法渲染。在 render 方法中,您可以使用属性“title”,该属性用于设置工具提示文本。简单的例子:

SampleColumn<T> extends TextColumn<T> {

  @Override
  public void render(Context context, T object, SafeHtmlBuilder sb) {
    sb.appendHtmlConstant("<div title=\"" + getTitle(object) + "\">");
    sb.appendEscaped(getValue(object));
    sb.appendHtmlConstant("</div>");
  }

  @Override
  public String getValue(T object) {
    return displayedValue;
  }

  public String getTitle(T object) {
    return yourTooltipText;
  }
}

使用此代码时,工具提示将恰好靠近目标单元格。

于 2012-10-11T07:40:53.203 回答
2
if (cellElement.getParentElement()
              .getFirstChildElement().isOrHasChild(Element.as(event.getNativeEvent().getEventTarget()))
              && cellElement.getTagName().equalsIgnoreCase("span"))

这解决了这个问题。
感谢安德烈和亚历克斯的回复。

于 2012-10-22T03:11:36.470 回答
2

谢谢大家,我也在寻找解决方案。

使用 A cup of tea 的答案,我制作了一个通用类,可以重用它来向任何单元格添加工具提示。它基于装饰器模式。如果它可以帮助某人:

public class TooltipCell extends AbstractSafeHtmlCell<String>
{
    AbstractCell<String> cell;
    private String tooltip;

    public TooltipCell(AbstractCell<String> cell, String tooltip)
    {
        super(SimpleSafeHtmlRenderer.getInstance(), BrowserEvents.CLICK, BrowserEvents.KEYDOWN);
        this.cell = cell;
        this.tooltip = tooltip;
    }

    @Override
    protected void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml data, SafeHtmlBuilder sb)
    {
        sb.appendHtmlConstant("<div title=\"" + tooltip + "\">");
        cell.render(context, data.asString(), sb);
        sb.appendHtmlConstant("</div>");
    }

    @Override
    public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context, Element parent, String value, NativeEvent event, ValueUpdater<String> valueUpdater)
    {
        cell.onBrowserEvent(context, parent, value, event, valueUpdater);
    }
}

然后可以按如下方式使用:

myColumn = new Column<MyObject, String>(new TooltipCell(new ButtonCell(), "tooltip text"))
    {
        @Override
        public String getValue(CurrencyDTO object)
        {
            return "button text";
        }
    };
于 2013-11-24T11:38:57.887 回答
0

此解决方案有效:

cellTable.addCellPreviewHandler(new Handler<List<String>>() {
  @Override
  public void onCellPreview(CellPreviewEvent<List<String>> event) {
    if ("mouseover".equals(event.getNativeEvent().getType())) {
      cellTable.getRowElement(event.getIndex()).getCells().getItem(event.getColumn()).setTitle('cell contents go here.');
    }
  }
}
于 2012-10-11T14:23:30.977 回答
0
cellTable.addCellPreviewHandler(new Handler<List<String>>() {
  @Override
  public void onCellPreview(CellPreviewEvent<List<String>> event) {
    if ("mouseover".equals(event.getNativeEvent().getType())) {
      cellTable.getRowElement(event.getIndex()).getCells().getItem(event.getColumn()).setTitle('cell contents go here.');
    }
  }
}

Andrei 的解决方案效果很好,但应该修复一个错误:

cellTable.getRowElement(event.getIndex() - cellTable.getPageStart()).getCells().getItem(event.getColumn()).setTitle('cell contents go here.');
于 2018-12-28T02:09:18.093 回答