gwt - 您如何为所有 GWT Grid 鼠标事件调用 "getCellForEvent()"?

标签 gwt

对于 GWT,当你有一个 Grid 时,我想获取什么行和列的事件。

所以我扩展了 GWT 网格来添加鼠标事件:

@Override
public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) {
    return this.addDomHandler(handler, MouseOverEvent.getType());
}

@Override
public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) {
    return this.addDomHandler(handler, MouseOutEvent.getType());
}

@Override
public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
    return this.addDomHandler(handler, MouseMoveEvent.getType());
}

然后我注册用于单击鼠标的事件处理程序:
// mouse event handler
g.addClickHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
        Cell cell = ((HTMLTable)event.getSource()).getCellForEvent(event);
        System.out.println("GridClickHandler: ("+cell.getRowIndex()+","+cell.getCellIndex()+")");
    }
});

所以现在我得到特定单元格的事件......但仅当您单击鼠标时。你如何为所有鼠标事件调用“getCellForEvent()”?

最佳答案

我让 getCellForEvent() 函数适用于所有鼠标事件类型(而不仅仅是单击事件)。

获得所需行为的方法是扩展 gwt 的 Grid。然后深入了解 getCellForEvent() 所在的位置并将这段代码复制到新的扩展网格中。将 getCellForEvent() 从“ClickEvent”更改为“MouseEvent”。

onModuleLoad():

    /*------ Create the main grid display ------*/
    // grid object
    final GridWithMouse g = new GridWithMouse(2, 2);
    // mouse over event handler
    g.addMouseOverHandler(new MouseOverHandler() {
        @Override
        public void onMouseOver(MouseOverEvent event) {
            Cell cell = ((GridWithMouse)event.getSource()).getCellForEvent(event);
            if(cell!=null) {
                System.out.println("Over: ("+cell.getRowIndex()+","+cell.getCellIndex()+")");
            }
        }
    });
    // mouse move event handler
    g.addMouseMoveHandler(new MouseMoveHandler() {
        @Override
        public void onMouseMove(MouseMoveEvent event) {
            Cell cell = ((GridWithMouse)event.getSource()).getCellForEvent(event);
            if(cell!=null) {
                System.out.println("Move: ("+cell.getRowIndex()+","+cell.getCellIndex()+")");
            }
        }
    });
    // mouse click event handler
    g.addClickHandler(new ClickHandler() {
        @SuppressWarnings("rawtypes")
        @Override
        public void onClick(ClickEvent event) {
            Cell cell = ((GridWithMouse)event.getSource()).getCellForEvent((MouseEvent)event);
            if(cell!=null) {
                System.out.println("Click: ("+cell.getRowIndex()+","+cell.getCellIndex()+")");
            }
        }
    });

新扩展的 Grid 类:

包 com.agilent.gridDisplay.client;
import com.google.gwt.dom.client.*
import com.google.gwt.event.dom.client.*
import com.google.gwt.event.shared.*
import com.google.gwt.user.client.*
import com.google.gwt.user.client.ui.*;

public class GridWithMouse 
       extends Grid
       implements HasMouseOutHandlers, HasMouseOverHandlers, HasMouseMoveHandlers
{

    /**
     * Return value for {@link HTMLTable#getCellForEvent}.
     */
    public class Cell extends com.google.gwt.user.client.ui.HTMLTable.Cell{
        public Cell(int rowIndex, int cellIndex) {
            super(rowIndex, cellIndex);
        }
    }

    public GridWithMouse(int rows, int cols) {
        super(rows,cols);
        for(int i = 0; i < 2; i++) {
            for(int j = 0; j < 2; j++) {
                this.setWidget(i,j,new Label("hello"+i));
            }
        }
    }

    /**
     * Given a click event, return the Cell that was clicked, or null if the event
     * did not hit this table.  The cell can also be null if the click event does
     * not occur on a specific cell.
     * 
     * @param event A click event of indeterminate origin
     * @return The appropriate cell, or null
     */
    @SuppressWarnings("rawtypes")
    public Cell getCellForEvent(MouseEvent event) {
        Element td = getEventTargetCell(Event.as(event.getNativeEvent()));
        if (td == null) {
            return null;
        }

        int row = TableRowElement.as(td.getParentElement()).getSectionRowIndex();
        int column = TableCellElement.as(td).getCellIndex();
        return new Cell(row, column);
    }

    @Override
    public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) {
        return this.addDomHandler(handler, MouseOverEvent.getType());
    }

    @Override
    public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) {
        return this.addDomHandler(handler, MouseOutEvent.getType());
    }

    @Override
    public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
        return this.addDomHandler(handler, MouseMoveEvent.getType());
    }

}

现在,不是为所有鼠标事件获取像素位置,而是为所有鼠标事件获取网格位置……这正是 Grid 从一开始就需要的!

关于gwt - 您如何为所有 GWT Grid 鼠标事件调用 "getCellForEvent()"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6035041/

相关文章:

java - 无法在处理程序方法之外访问 Canvas 元素

eclipse - 当我进行仅服务器更改时说服 eclipse/GPE 不重新编译 GWT 代码

java - 无法显示 GWT DataGrid

GWT:我可以在显示弹出窗口后将“延迟”放几秒钟吗

java - GWT 编辑器和 GAE 数据存储

eclipse - 注入(inject)构造函数时出错,org.hibernate.HibernateException : Unable to instantiate default tuplizer

gwt - 不带冒号的地名 (:)?

java - 将 JUNG 移植到 GWT

java - GWT - HTML 小部件 - 如何不换行

java - 从 JSNI 调用 Java 函数