GWT CellTable:如何动态更新TextBox

时间:2014-11-06 01:09:51

标签: gwt celltable gwt-celltable

我有以下 CellTable CellTable

当用户点击 Pay Min。 CheckBox时,它应该将截止日期列中的值复制到立即付款文字字段并重新计算立即支付列的总计。

以下是 CheckboxCell Pay Min。)和 TextInputCell 立即付款)的代码列:

private Column<AccountInvoice, Boolean> buildPayMin() {

    columnPayMin = new Column<AccountInvoice, Boolean>(new CheckboxCell(true, false)) {
        @Override
        public Boolean getValue(AccountInvoice object) {
            return object.isPayMinimum();
        }

        @Override 
        public void onBrowserEvent(Context context, Element elem, AccountInvoice object, NativeEvent event){

            // Get event type
            int eventType = Event.as(event).getTypeInt();

            // See if this is a 'change' event
            if (eventType == Event.ONCHANGE) {

                String value = columnMinDue.getValue(object);

                // Get the cell to copy the value from                  
                TextInputCell cell = (TextInputCell) columnPayToday.getCell();
                // Re-create the view data for the cell
                TextInputCell.ViewData viewData = new TextInputCell.ViewData(value);
                cell.setViewData(object, viewData);
                // Refresh
                cellTable.redraw();

                event.preventDefault();
                event.stopPropagation();
            }
        }
    };
    columnPayMin.setDataStoreName(columnPayMinHeader);
    columnPayMin.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
    columnPayMin.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
    return columnPayMin;
}

// -----------------------------------------------------------

private Column<AccountInvoice, String> buildPayToday() {
    columnPayToday = new Column<AccountInvoice, String>(new TextInputCell()) {
        @Override
        public String getValue(AccountInvoice object) {
            return object.getPaymentAmount();
        }
    };
    columnPayToday.setDataStoreName(columnPayTodayHeader);
    columnPayToday.setFieldUpdater(new FieldUpdater<AccountInvoice, String>() {
        @Override
        public void update(int index, AccountInvoice object, String value) {
            object.setPaymentAmount(value);
            cellTable.redraw();
        }
    });
    return columnPayToday;
}

我可以获得要复制的值,但立即付款列的总数不会刷新。只有在立即支付文本字段中手动输入值时,它才会刷新。我甚至尝试过:

columnPayToday.getFieldUpdater().update(context.getIndex(), object, value);

也没有帮助。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

ViewData表示TextInputCell中的临时值。当您调用cellTable.redraw()时,TextInputCell将恢复为原始值(该列的getValue()方法中的值)。

如果您只想修改&#34;视图&#34;请勿重绘表格。 TextInputCell的状态,或调用accountInvoice.setPayToday#(或其他任何方法)来更新对象,然后在ListDataProvider上调用refresh()(与重绘相比,这是一种更有效的更新表的方法)。