当用户将鼠标悬停在GWT CellTable中的列标题上时,是否有任何方法触发方法?

当用户将鼠标悬停在GWT CellTable中的列标题上时,是否有任何方法触发方法?,gwt,Gwt,好的,我有一个CellTableCellTable=newcelltable() &nameColumnIndexedColumn nameColumn=新的IndexedColumn(0) 然后table.addColumn(nameColumn,“Name”) 我希望当用户mouseOvername列的标题时,它将触发methodX table.addCellPreviewHandler仅适用于表中的单元格,不适用于列的标题或标题 table.addCellPreviewHandler(ne

好的,我有一个CellTable
CellTable=newcelltable()

&nameColumn
IndexedColumn nameColumn=新的IndexedColumn(0)

然后
table.addColumn(nameColumn,“Name”)

我希望当用户
mouseOver
name列的标题
时,它将触发
methodX

table.addCellPreviewHandler
仅适用于表中的单元格,不适用于列的标题或标题

table.addCellPreviewHandler(new Handler<List<String>>(){

        @Override
        public void onCellPreview(
                        CellPreviewEvent<List<String>> event) {

        if ("mouseover".equals(event.getNativeEvent().getType())) {
                        int col=event.getColumn();
                        int row=event.getIndex();
        //call sthing here
        }
});

但是Gwt似乎没有识别出
“mouseover”.equals(event.getType())

我们所有人有时都会遇到“小部件”和事件的问题,所以不要担心

问题是ClickableTextCell只有“
click
”和“
keydown
”的沉没事件,因此它不再侦听

通常在小部件中,您可以使用方法
sinkEvents
指定更多事件,但在这种情况下,该方法不存在

依我看来,最简单的解决办法是创建自己的“
ClickableTextCell
”。我已经做到了,工作起来很有魅力:

import static com.google.gwt.dom.client.BrowserEvents.CLICK;
import static com.google.gwt.dom.client.BrowserEvents.KEYDOWN;
import static com.google.gwt.dom.client.BrowserEvents.MOUSEOUT;
import static com.google.gwt.dom.client.BrowserEvents.MOUSEOVER;

import com.google.gwt.cell.client.AbstractSafeHtmlCell;
import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.text.shared.SafeHtmlRenderer;
import com.google.gwt.text.shared.SimpleSafeHtmlRenderer;


public abstract class MyClickableTextCell extends AbstractSafeHtmlCell<String> {

  /**
   * Construct a new ClickableTextCell that will use a
   * {@link SimpleSafeHtmlRenderer}.
   */
  public MyClickableTextCell() {
    this(SimpleSafeHtmlRenderer.getInstance());
  }

  /**
   * Construct a new ClickableTextCell that will use a given
   * {@link SafeHtmlRenderer}.
   * 
   * @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
   */
  public MyClickableTextCell(SafeHtmlRenderer<String> renderer) {
    super(renderer, CLICK, KEYDOWN, MOUSEOVER, MOUSEOUT);
  }

  @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())) {
      onEnterKeyDown(context, parent, value, event, valueUpdater);
    }
    if (CLICK.equals(event.getType())) {
      onEnterKeyDown(context, parent, value, event, valueUpdater);
    }
    if (MOUSEOVER.equals(event.getType())) {
      onMouseOver(context, parent, value, event, valueUpdater);
    }
    if (MOUSEOUT.equals(event.getType())) {
      onMouseOut(context, parent, value, event, valueUpdater);
    }
  }

  public abstract void onMouseOver(com.google.gwt.cell.client.Cell.Context context, Element parent,
      String value, NativeEvent event, ValueUpdater<String> valueUpdater);

  public abstract void onMouseOut(com.google.gwt.cell.client.Cell.Context context, Element parent,
      String value, NativeEvent event, ValueUpdater<String> valueUpdater);

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

  @Override
  protected void render(Context context, SafeHtml value, SafeHtmlBuilder sb) {
    if (value != null) {
      sb.append(value);
    }
  }
}
import static com.google.gwt.dom.client.BrowserEvents.CLICK;
导入静态com.google.gwt.dom.client.BrowserEvents.KEYDOWN;
导入静态com.google.gwt.dom.client.BrowserEvents.MOUSEOUT;
导入静态com.google.gwt.dom.client.BrowserEvents.MOUSEOVER;
导入com.google.gwt.cell.client.AbstractSafetHtmlCell;
导入com.google.gwt.cell.client.cell.Context;
导入com.google.gwt.cell.client.ValueUpdater;
导入com.google.gwt.dom.client.Element;
导入com.google.gwt.dom.client.NativeEvent;
导入com.google.gwt.safehtml.shared.safehtml;
导入com.google.gwt.safehtml.shared.SafeHtmlBuilder;
导入com.google.gwt.text.shared.SafeHtmlRenderer;
导入com.google.gwt.text.shared.SimpleSafeHtmlRenderer;
公共抽象类MyClickableTextCell扩展了AbstractSafeThlCell{
/**
*构造一个新的ClickableTextCell,它将使用
*{@link SimpleSafeHtmlRenderer}。
*/
公共MyClickableTextCell(){
这是(SimpleSafeHtmlRenderer.getInstance());
}
/**
*构造一个新的ClickableTextCell,它将使用给定的
*{@link SafeHtmlRenderer}。
* 
*@param呈现程序{@link SafeHtmlRenderer SafeHtmlRenderer}实例
*/
公共MyClickableTextCell(安全HtmlRenderer渲染器){
超级(渲染器、单击、向下键、鼠标悬停、鼠标悬停);
}
@凌驾
public void onBrowserEvent(上下文上下文、元素父级、字符串值、,
NativeEvent事件,ValueUpdater(ValueUpdater){
onBrowserEvent(上下文、父级、值、事件、值更新程序);
if(单击.equals(event.getType())){
onEnterKeyDown(上下文、父级、值、事件、值更新程序);
}
if(单击.equals(event.getType())){
onEnterKeyDown(上下文、父级、值、事件、值更新程序);
}
if(MOUSEOVER.equals(event.getType())){
onMouseOver(上下文、父级、值、事件、值更新程序);
}
if(MOUSEOUT.equals(event.getType())){
onMouseOut(上下文、父级、值、事件、值更新程序);
}
}
mouseover上的公共抽象void(com.google.gwt.cell.client.cell.Context上下文,元素父元素,
字符串值、NativeEvent事件、ValueUpdater ValueUpdater);
公共抽象void onMouseOut(com.google.gwt.cell.client.cell.Context上下文,元素父元素,
字符串值、NativeEvent事件、ValueUpdater ValueUpdater);
@凌驾
受保护的void onEnterKeyDown(上下文上下文、元素父元素、字符串值、,
NativeEvent事件,ValueUpdater(ValueUpdater){
if(valueUpdater!=null){
valueUpdater.update(值);
}
}
@凌驾
受保护的void呈现(上下文上下文、安全HTML值、安全HTMLBuilder sb){
if(值!=null){
附加(价值);
}
}
}
如您所见,创建对象时需要填充两个抽象方法。这些方法是在启动onMouseOver和onMouseOut时使用的

因此,基本上,当您创建
标题名称ColumnHeader
时,您应该执行以下操作:

    MyClickableTextCell cl = new MyClickableTextCell() {

      @Override
      public void onMouseOver(Context context, Element parent, String value, NativeEvent event,
          ValueUpdater<String> valueUpdater) {
        GQuery.console.log("onMouseOver");
      }

      @Override
      public void onMouseOut(Context context, Element parent, String value, NativeEvent event,
          ValueUpdater<String> valueUpdater) {
        GQuery.console.log("onMouseOut");        
      }
    };

  //Specify the MyClickableTextCell to you Column's Header  
  Header<String> nameColumnHeader = new Header<String>(cl){
      ....
  }

  .... //Add the Column with the Header to the CellTable as normal.
MyClickableTextCell cl=新建MyClickableTextCell(){
@凌驾
mouseover上的公共void(上下文上下文、元素父元素、字符串值、NativeEvent事件、,
ValueUpdater(ValueUpdater){
GQuery.console.log(“onMouseOver”);
}
@凌驾
public void onMouseOut(上下文上下文、元素父元素、字符串值、NativeEvent事件、,
ValueUpdater(ValueUpdater){
GQuery.console.log(“onMouseOut”);
}
};
//为列标题指定MyClickableTextCell
标题名称ColumnHeader=新标题(cl){
....
}
.... //将标题为的列按常规添加到CellTable。

快乐编码

thax你,我来测试你的解决方案你试过了吗?我很好奇它是否奏效,或者你是否找到了另一个解决办法。谢谢
    MyClickableTextCell cl = new MyClickableTextCell() {

      @Override
      public void onMouseOver(Context context, Element parent, String value, NativeEvent event,
          ValueUpdater<String> valueUpdater) {
        GQuery.console.log("onMouseOver");
      }

      @Override
      public void onMouseOut(Context context, Element parent, String value, NativeEvent event,
          ValueUpdater<String> valueUpdater) {
        GQuery.console.log("onMouseOut");        
      }
    };

  //Specify the MyClickableTextCell to you Column's Header  
  Header<String> nameColumnHeader = new Header<String>(cl){
      ....
  }

  .... //Add the Column with the Header to the CellTable as normal.