如何在GWT中向Flextable添加行侦听器?

时间:2009-03-27 21:08:01

标签: css gwt

如何将行侦听器添加到特定行或表中的所有行?我需要在行中添加一种“onMouseOver”监听器,这样当你将鼠标悬停在它们上面时,它会改变行的背景颜色,就像getRowFormatter允许你做的那样。

4 个答案:

答案 0 :(得分:11)

// this is click 
final FlexTable myTable = new FlexTable();
myTable.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
        Cell cell = myTable.getCellForEvent(event);
        int receiverRowIndex = cell.getRowIndex(); // <- here!
    }
});

答案 1 :(得分:5)

假设GWT 1.5.3:

点击事件处理

如果您使用FlexTable并且想要点击事件处理程序,则可以使用FlexTable.addTableListener()并注册自己的TableListenerTableListener对象需要实现onCellClicked回调,它会为您提供行号。

其他事件处理(例如HOVER)

如果您需要处理除点击之外的其他类型的事件(例如,悬停),GWT目前没有现成的接口。你自己几乎要自己实现它们。我现在能想到的有两种方法:

  1. 快速而肮脏的方式可能是利用JSNI,它为您提供了一种将Javascript注入GWT代码的方法。在我的代码中,我没有使用太多的JSNI(除了真正难以在纯GWT中编写它的努力方法),所以我不能给你一个例子;但坦率地说,我不建议这样做,因为它会降低可维护性和可扩展性。

  2. 如果您需要本机GWT接口,则可以创建一个继承HTMLTable或FlexTable的新类。在构造函数中,使用您需要的事件调用sinkEvents函数。 (例如,对于悬停,你可能需要sinkEvents(Event.ONMOUSEOVER))。然后你需要处理鼠标悬停的onBrowserEvent函数。

    代码应如何显示的快速模板:

    import com.google.gwt.user.client.DOM;
    import com.google.gwt.user.client.Event;
    import com.google.gwt.user.client.ui.FlexTable;
    public class FlexTableWithHoverHandler
        extends FlexTable
    {
        public FlexTableWithHoverHandler()
        {
            super();
            sinkEvents(Event.ONMOUSEOVER);
        }
        @Override
        public void onBrowserEvent(Event event)
        {
            switch(DOM.eventGetType(event))
            {
            case Event.ONMOUSEOVER:
                // Mouse over handling code here
                break;
            default:
                break;
            }
        }
    }
    

    最好学习如何对此进行编码是通过查看GWT源代码本身(搜索sinkEvent)并了解如何以GWT方式进行编码。

答案 2 :(得分:1)

我发现将javascript直接添加到TR元素非常简单。我的代码假设一个小部件DOM父级是TD而祖父母是TR,所以你需要确保你知道你的DOM。

这是我的代码。简单,不需要JSNI或GWT DOM事件管理。

TableRowElement rowElement =(TableRowElement)checkbox.getElement()。getParentElement()。getParentElement();

rowElement.setAttribute(“onMouseOver”,“this.className ='”+ importRecordsResources.css()。normalActive()+“'”);

rowElement.setAttribute(“onMouseOut”,“this.className ='”+ importRecordsResources.css()。normal()+“'”);

答案 3 :(得分:0)

我只是这么简单地做到了:

protected void handleRowsSelectionStyles(ClickEvent event) {
    int selectedRowIndex = fieldTable.getCellForEvent(event).getRowIndex();
    int rowCount = fieldTable.getRowCount();
    for (int row = 0; row < rowCount; row++) {
        Element rowElem = fieldTable.getRowFormatter().getElement(row);
        rowElem.setClassName(row == selectedRowIndex ? "row selected" : "row");
    }
}

您可以从要点击的单元格中调用此方法

int row = 0;
for (final RowDataProxy rowData : rowDataList) {
    Label fieldName = new Label(rowData.name());
    fieldName.addClickHandler(new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {
            handleRowsSelectionStyles(event);
        }
    });
    fieldTable.setWidget(row++, 0, fieldName);
}

最诚挚的问候,

Zied Hamdi