如何使用具有自定义表生成器的clickhandler GWT呈现GWT窗口小部件?

时间:2012-08-02 09:49:01

标签: gwt-celltable gwt-2.5

我正在尝试使用GWT 2.5rc1自定义表格构建器为我的数据网格中的每一行呈现子表。我已经按照2.5 rc1展示中的示例(url:http://showcase2.jlabanca-testing.appspot.com/#!CwCustomDataGrid)。 我能够看到新添加的子行,但是当我想将一个clickhandler添加到一个子行锚元素时问题就来了。从不调用clickhandler,这对我来说似乎也很清楚,因为我不是在任何地方“注册”事件处理程序。

这里是我现在使用的代码,“相关部分”:

private void buildRegRow(Registrazione rowValue,final int absRowIndex, boolean isCommentRow) {
        // Calculate the row styles.
        SelectionModel<? super Registrazione> selectionModel = cellTable.getSelectionModel();
        boolean isSelected =
                (selectionModel == null || rowValue == null) ? false : selectionModel
                        .isSelected(rowValue);
        boolean isEven = absRowIndex % 2 == 0;
        StringBuilder trClasses = new StringBuilder(rowStyle);
        if (isSelected) {
            trClasses.append(selectedRowStyle);
        }

        // Calculate the cell styles.
        String cellStyles = cellStyle;
        if (isSelected) {
            cellStyles += selectedCellStyle;
        }

        if(isCommentRow)
            cellStyles += childCell;

        TableRowBuilder row = startRow();
        row.className(trClasses.toString());

        /*
         * Checkbox column.
         * 
         * This table will uses a checkbox column for selection. Alternatively,
         * you can call dataGrid.setSelectionEnabled(true) to enable mouse
         * selection.
         */
        TableCellBuilder td = row.startTD();
        td.className(cellStyles);
        td.style().outlineStyle(OutlineStyle.NONE).endStyle();
        if (!isCommentRow) {
            renderCell(td, createContext(0), cellTable.getColumn(0), rowValue);
        }
        td.endTD();

        /*
         * View children column.
         * 
         * Displays a link to "show children". When clicked, the list of friends is
         * displayed below the contact.
         */
        td = row.startTD();
        td.className(cellStyles);
        if(!isCommentRow) {
            td.style().outlineStyle(OutlineStyle.NONE).endStyle();
            if(rowValue.hasComments())
                //td.className(CellTableResource.INSTANCE.dataGridStyle().showChildren());
                renderCell(td, createContext(1), cellTable.getColumn(1), rowValue);
        } else {
            td.colSpan(getColumns().size() - 1);

//              // Draw sub-table header
            TableBuilder subTable = td.startTable();
            TableSectionBuilder subTableSection = subTable.startTHead();
            TableRowBuilder tr2 = subTableSection.startTR();
            TableCellBuilder td2 = tr2.startTH();
            td2.text(msgs.date());
            tr2.endTH();
            td2 = tr2.startTH();
            td2.text(msgs.username());
            tr2.endTH();
            td2 = tr2.startTH();
            td2.text(msgs.comment());
            tr2.endTH();
            td2 = tr2.startTH();
            td2.text(msgs.actions());
            tr2.endTH();

            subTableSection.endTR();
            subTable.endTHead();
            subTableSection = subTable.startTBody();
            for(final EntityComment ec : rowValue.getCommentList()) {
                tr2 = subTableSection.startTR();

                // Date
                td2 = tr2.startTD();
                td2.text(DateUtil.getDefaultDateTimeFormat().format(ec.getCreationDate()));
                tr2.endTD();

                // Username
                td2 = tr2.startTD();
                td2.text(ec.getUsername());
                tr2.endTD();

                // Text
                td2 = tr2.startTD();
                td2.text(ec.getText());
                tr2.endTD();

                // Actions
                td2 = tr2.startTD();

                    // Remove
                Anchor removeAnchor = new Anchor("remove");
                removeAnchor.addClickHandler(new ClickHandler() {

                    @Override
                    public void onClick(ClickEvent event) {
                        Window.alert("clicked");
                    }
                });
                td2.html(new SafeHtmlBuilder().appendHtmlConstant(removeAnchor.toString()).toSafeHtml());
                tr2.endTD();

                subTableSection.endTR();
            }
            subTable.endTBody();
            td.endTable();
        }
        td.endTD();

        for(int i = 2; i <= 6; i++) {
            // Recorded, list name, callcenter, msisdn
            td = row.startTD();
            td.className(cellStyles);
            td.style().outlineStyle(OutlineStyle.NONE).endStyle();
            if(!isCommentRow) {
                renderCell(td, createContext(i), cellTable.getColumn(i), rowValue);
            }
            td.endTD();
        }


        row.endTR();
    }

子表格显示,锚点位于正确的位置,但从不调用clickhandler。我不知道如何将处理程序代码写入页面,就像我完成渲染锚一样。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我尝试过自定义的tablebuilder并创建了一个网格。您可以使用适当的结构添加任何元素。确保为您创建的每个元素设置唯一ID。然后通过代码通过以下代码访问元素,

Element e = DOM.getElementById( id );

将元素转换为适当的小部件,例如,如果使用文本输入元素,则始终可以将其强制转换为文本框。要投射元素,还有一个步骤,您可以谷歌。然后添加clickhandler或任何你想要的处理程序。