2012-10-11 47 views
3

我正在使用CellTable,並且每當我將鼠標懸停在任何單元格上時,我都想顯示工具提示。 我的代碼工作正常,但工具提示並未改變其位置。

我的意思是說,如果我將鼠標懸停在單元格1的工具提示顯示上,然後如果我將鼠標懸停在單元格100上,工具提示數據會發生變化,但工具提示仍會顯示在單元格1

我使用下面的代碼:
GWT CellTable工具提示無法正常工作

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



任何幫助深表感謝。
謝謝。

回答

2
if (cellElement.getParentElement() 
       .getFirstChildElement().isOrHasChild(Element.as(event.getNativeEvent().getEventTarget())) 
       && cellElement.getTagName().equalsIgnoreCase("span")) 

這解決了問題。
謝謝安德烈&亞歷克斯的答覆。

2

您可以擴展Column類並覆蓋方法渲染。在渲染方法中,您可以使用屬性「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; 
    } 
} 

使用此代碼時,工具提示將非常靠近目標單元格。

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.'); 
    } 
    } 
} 
+0

安德烈嗨,你確定這個工程?因爲它不適合我。我已將一個跨度放在我的單元格表格的每個單元格上。 ABC,這裏ABC顯示在單元格上。我使用span的屬性向我的單元格發送一些額外的信息。你認爲這可能會導致我的工具提示行爲異常。謝謝 – EMM

+0

我測試了它 - 它在我的CellTable中運行良好。請注意,attribute =「value」不是標準的HTML,所以它會被瀏覽器忽略,甚至可能在渲染前被刪除。確保你沒有在你的跨度上設置標題 - 它們會干擾單元格上的標題。你應該使用標準的TextCell。 –

1

謝謝大家,我也在尋找解決方案。

使用一杯茶的答案,我做了一個泛型類,可以重複使用以將工具提示添加到任何單元格。它基於裝飾模式。這是,如果它可以幫助別人:

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