Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用GWT CellTableBuilder按需构建自定义行_Gwt - Fatal编程技术网

使用GWT CellTableBuilder按需构建自定义行

使用GWT CellTableBuilder按需构建自定义行,gwt,Gwt,GWT2.5中引入了RC CellTableBuilder API,但目前还没有全面的文档可用。是否有使用CellTableBuilder实现按需定制行生成的教程\示例?到目前为止,我发现的唯一一个例子是这个,但它对我来说相当混乱 所以,我的目标是创建额外的包含小部件的行,该小部件提供有关表中单击行的详细信息。我找到了解决此问题的合适方法。以下是代码示例: public class CustomCellTableBuilder extends AbstractCellTableBuilder&l

GWT2.5中引入了RC CellTableBuilder API,但目前还没有全面的文档可用。是否有使用CellTableBuilder实现按需定制行生成的教程\示例?到目前为止,我发现的唯一一个例子是这个,但它对我来说相当混乱


所以,我的目标是创建额外的包含小部件的行,该小部件提供有关表中单击行的详细信息。

我找到了解决此问题的合适方法。以下是代码示例:

public class CustomCellTableBuilder extends AbstractCellTableBuilder<Object>{
//here go fields, ctor etc.

//ids of elements which details we are going to show 
private Set elements;

@Override
protected void buildRowImpl(Object rowValue, int absRowIndex){
   //building main rows logic 

    if(elements.contains(absRowIndex)){
        buildExtraRow(absRowIndex, rowValue);
        elements.add(absRowIndex);
    }
}

private void buildExtraRow(int index, Object rowValue){
    TableRowBuilder row = startRow();
    TableCellBuilder td = row.startTD().colSpan(getColumns().size());
    DivBuilder div = td.startDiv();

    Widget widget = new Widget();

    //update widget state and appearance here depending on rowValue

    div.html(SafeHtmlUtils.fromTrustedString(widget.getElement().getInnerHTML()));

    div.end();
    td.endTD();
    row.endTR();
}}
公共类CustomCellTableBuilder扩展了AbstractCellTableBuilder{
//这是田地等。
//我们将要显示的详细信息的元素ID
私有集合元素;
@凌驾
受保护的void buildRowImpl(对象rowValue,int absRowIndex){
//构建主行逻辑
if(elements.contains(absRowIndex)){
buildExtraRow(absRowIndex,rowValue);
元素。添加(absRowIndex);
}
}
私有void buildextrow(int索引,对象行值){
TableRowBuilder行=startRow();
TableCellBuilder td=row.startTD().colSpan(getColumns().size());
DivBuilder div=td.startDiv();
Widget Widget=newwidget();
//根据rowValue在此处更新小部件状态和外观
div.html(safehtmlitls.fromTrustedString(widget.getElement().getInnerHTML());
div.end();
td.endTD();
行。endTR();
}}
应该提到的是,当您处理一些导致额外行出现的事件时,应该调用附加到TableBuilder的CellTable上的重画(rowIndex)。在此调用之前,需要将目标行ID添加到元素集


希望这有帮助。

我创建了这个类来扩展GWT中的行。它将获取要展开的列,并将其替换为可以具有2个状态的占位符

我是这样使用它的:

PlaceHolderColumn<Notification, SafeHtml> placeholder = new PlaceHolderColumn<Notification, SafeHtml>(new SafeHtmlCell()) {
        @Override
        public SafeHtml getValue(Notification object) {
            return SafeHtmlUtils.fromSafeConstant(getSelected() ? "<i class=\"glyphicon glyphicon-chevron-down\"></i>"
                    : "<i class=\"glyphicon glyphicon-chevron-right\"></i>");
        }
    };

    notificationsTable.setTableBuilder(new ExpandableCellTableBuilder<Notification, SafeHtml>(notificationsTable, columnBody, placeholder));

如果你找到了答案,不要将其作为编辑发布。把它作为一个答案,并勾选它,以便其他人可以从中受益。您可以在“根据行值更新小部件状态和外观”的注释中显示您的代码类型吗?您应该为行构建单元格吗?我尝试了一个简单的测试,比如将小部件设置为标签,但什么也没发生。@NunoGonçalves,您是否将标签添加为小部件的子项?调试器是否进入了
buildextrow(int-index,Object-rowValue)
method?@NunoGonçalves,应该提到的是,我从这个实现切换到了更适合我需要的自编表组件:我需要另一个
CellTable
作为子窗口小部件,并且事件传播存在很多问题。是的,调用了我的buildExtraRow。我有以下代码:(我知道注释上的代码很难阅读):TableRowBuilder row=startRow();TableCellBuilder td=row.startTD().colSpan(getColumns().size());DivBuilder div=td.startDiv();标签=新标签(“你好世界”);div.html(safehtmlitls.fromTrustedString(label.getElement().getInnerHTML());div.end();td.endTD();行。endTR();div对象具有以下字符串生成器://OLAAAAAA。但什么也没发生。我似乎看不到桌子上有什么变化。@NunoGonçalves的想法是您将另一个孩子附加到
小部件上。尝试添加样式化的
SimplePanel
或类似的东西。我认为从
Label
生成
SafeHtml
时可能会出现一些问题。
public class ExpandableCellTableBuilder<T, U> extends AbstractCellTableBuilder<T> {

private Column<T, U> expandColumn = null;
private PlaceHolderColumn<T, ?> placeholderColumn = null;

private final String evenRowStyle;
private final String oddRowStyle;
private final String selectedRowStyle;
private final String cellStyle;
private final String evenCellStyle;
private final String oddCellStyle;
private final String firstColumnStyle;
private final String lastColumnStyle;
private final String selectedCellStyle;

public static class ExpandMultiSelectionModel<T> extends AbstractSelectionModel<T> {

    Map<Object, T> selected = new HashMap<Object, T>();

    /**
     * @param keyProvider
     */
    public ExpandMultiSelectionModel(ProvidesKey<T> keyProvider) {
        super(keyProvider);
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.google.gwt.view.client.SelectionModel#isSelected(java.lang.Object)
     */
    @Override
    public boolean isSelected(T object) {
        return isKeySelected(getKey(object));
    }

    protected boolean isKeySelected(Object key) {
        return selected.get(key) != null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.google.gwt.view.client.SelectionModel#setSelected(java.lang.Object, boolean)
     */
    @Override
    public void setSelected(T object, boolean selected) {
        Object key = getKey(object);
        if (isKeySelected(key)) {
            this.selected.remove(key);
        } else {
            this.selected.put(key, object);
        }
        scheduleSelectionChangeEvent();
    }
}

public static abstract class PlaceHolderColumn<T, C> extends Column<T, C> {

    private boolean isSelected;

    /**
     * @param cell
     */
    public PlaceHolderColumn(Cell<C> cell) {
        super(cell);
    }

    protected boolean getSelected() {
        return isSelected;
    }

}

private int expandColumnIndex;

public ExpandableCellTableBuilder(AbstractCellTable<T> cellTable, Column<T, U> expandColumn) {
    this(cellTable, expandColumn, new ExpandMultiSelectionModel<T>(cellTable.getKeyProvider()), null);
}

public ExpandableCellTableBuilder(AbstractCellTable<T> cellTable, Column<T, U> exandColumn, SelectionModel<T> selectionModel) {
    this(cellTable, exandColumn, selectionModel, null);
}

public ExpandableCellTableBuilder(AbstractCellTable<T> cellTable, Column<T, U> exandColumn, PlaceHolderColumn<T, ?> placeHolder) {
    this(cellTable, exandColumn, new ExpandMultiSelectionModel<T>(cellTable.getKeyProvider()), placeHolder);
}

/**
 * @param cellTable
 * @param columnBody
 */
public ExpandableCellTableBuilder(AbstractCellTable<T> cellTable, Column<T, U> expandColumn, SelectionModel<T> selectionModel,
        PlaceHolderColumn<T, ?> placeHolder) {
    super(cellTable);

    this.expandColumn = expandColumn;

    this.cellTable.setSelectionModel(selectionModel);

    if (placeHolder == null) {
        this.placeholderColumn = new PlaceHolderColumn<T, String>(new TextCell()) {
            @Override
            public String getValue(T object) {
                return getSelected() ? "-" : "+";
            }
        };
    } else {
        this.placeholderColumn = placeHolder;
    }

    // Cache styles for faster access.
    Style style = cellTable.getResources().style();
    evenRowStyle = style.evenRow();
    oddRowStyle = style.oddRow();
    selectedRowStyle = " " + style.selectedRow();
    cellStyle = style.cell();
    evenCellStyle = " " + style.evenRowCell();
    oddCellStyle = " " + style.oddRowCell();
    firstColumnStyle = " " + style.firstColumn();
    lastColumnStyle = " " + style.lastColumn();
    selectedCellStyle = " " + style.selectedRowCell();
}

/*
 * (non-Javadoc)
 * 
 * @see com.google.gwt.user.cellview.client.AbstractCellTableBuilder#buildRowImpl(java.lang.Object, int)
 */
@Override
protected void buildRowImpl(T rowValue, int absRowIndex) {
    // Calculate the row styles.
    SelectionModel<? super T> selectionModel = cellTable.getSelectionModel();
    final boolean isSelected = (selectionModel == null || rowValue == null) ? false : selectionModel.isSelected(rowValue);
    boolean isEven = absRowIndex % 2 == 0;
    StringBuilder trClasses = new StringBuilder(isEven ? evenRowStyle : oddRowStyle);
    if (isSelected) {
        trClasses.append(selectedRowStyle);
    }

    // Add custom row styles.
    RowStyles<T> rowStyles = cellTable.getRowStyles();
    if (rowStyles != null) {
        String extraRowStyles = rowStyles.getStyleNames(rowValue, absRowIndex);
        if (extraRowStyles != null) {
            trClasses.append(" ").append(extraRowStyles);
        }
    }

    // Build the row.
    TableRowBuilder tr = startRow();
    tr.className(trClasses.toString());

    // Build the columns.
    int columnCount = cellTable.getColumnCount();
    for (int curColumn = 0; curColumn < columnCount; curColumn++) {
        Column<T, ?> column = cellTable.getColumn(curColumn);

        if (column == expandColumn) {
            expandColumnIndex = curColumn;
            column = placeholderColumn;
            placeholderColumn.isSelected = isSelected;
        }

        // Create the cell styles.
        StringBuilder tdClasses = new StringBuilder(cellStyle);
        tdClasses.append(isEven ? evenCellStyle : oddCellStyle);
        if (curColumn == 0) {
            tdClasses.append(firstColumnStyle);
        }
        if (isSelected) {
            tdClasses.append(selectedCellStyle);
        }
        // The first and last column could be the same column.
        if (curColumn == columnCount - 1) {
            tdClasses.append(lastColumnStyle);
        }

        // Add class names specific to the cell.
        Context context = new Context(absRowIndex, curColumn, cellTable.getValueKey(rowValue));
        String cellStyles = column.getCellStyleNames(context, rowValue);
        if (cellStyles != null) {
            tdClasses.append(" " + cellStyles);
        }

        // Build the cell.
        HorizontalAlignmentConstant hAlign = column.getHorizontalAlignment();
        VerticalAlignmentConstant vAlign = column.getVerticalAlignment();
        TableCellBuilder td = tr.startTD();
        td.className(tdClasses.toString());
        if (hAlign != null) {
            td.align(hAlign.getTextAlignString());
        }
        if (vAlign != null) {
            td.vAlign(vAlign.getVerticalAlignString());
        }

        // Add the inner div.
        DivBuilder div = td.startDiv();
        div.style().outlineStyle(OutlineStyle.NONE).endStyle();

        // Render the cell into the div.
        renderCell(div, context, column, rowValue);

        // End the cell.
        div.endDiv();
        td.endTD();
    }

    // End the row.
    tr.endTR();

    if (isSelected) {
        buildExpandedRow(rowValue, absRowIndex, columnCount, trClasses, isEven, isSelected);
    }
}

/**
 * @param trClasses
 * 
 */
private void buildExpandedRow(T rowValue, int absRowIndex, int columnCount, StringBuilder trClasses, boolean isEven, boolean isSelected) {
    TableRowBuilder tr = startRow();
    tr.className(trClasses.toString());

    Column<T, ?> column = expandColumn;
    // Create the cell styles.
    StringBuilder tdClasses = new StringBuilder(cellStyle);
    tdClasses.append(isEven ? evenCellStyle : oddCellStyle);
    tdClasses.append(firstColumnStyle);
    if (isSelected) {
        tdClasses.append(selectedCellStyle);
    }
    tdClasses.append(lastColumnStyle);

    // Add class names specific to the cell.
    Context context = new Context(absRowIndex, expandColumnIndex, cellTable.getValueKey(rowValue));
    String cellStyles = column.getCellStyleNames(context, rowValue);
    if (cellStyles != null) {
        tdClasses.append(" " + cellStyles);
    }

    // Build the cell.
    HorizontalAlignmentConstant hAlign = column.getHorizontalAlignment();
    VerticalAlignmentConstant vAlign = column.getVerticalAlignment();
    TableCellBuilder td = tr.startTD();
    td.colSpan(columnCount);
    td.className(tdClasses.toString());
    if (hAlign != null) {
        td.align(hAlign.getTextAlignString());
    }
    if (vAlign != null) {
        td.vAlign(vAlign.getVerticalAlignString());
    }

    // Add the inner div.
    DivBuilder div = td.startDiv();
    div.style().outlineStyle(OutlineStyle.NONE).endStyle();

    // Render the cell into the div.
    renderCell(div, context, column, rowValue);

    // End the cell.
    div.endDiv();
    td.endTD();

    // End the row.
    tr.endTR();
}