GWT CellTable,单击时禁用ButtonCell

时间:2012-01-03 15:51:54

标签: gwt gwt-celltable

我对GWT很新,但到目前为止我一直在快速进步。

我有一个单元格表,其中大部分是从RPC返回的只读数据。

我在单元格表中有两列用户可以与之交互。一个是TextInputCell,一个是ButtonCell。

当用户单击ButtonCell时,我想将该行的TextInputCell中的值发送到RPC。

我完成了所有这些工作。

我无法工作的部分是当单击按钮(ButtonCell)时,我想要禁用该行中的按钮,直到RPC返回,然后重新启用它。我还想在RPC返回时清除该行的输入单元格中的文本。

我无法弄清楚如何获取被点击的实际ButtonCell对象或TextInputCell与它们一起使用的句柄。

任何帮助表示感谢。

BQ

2 个答案:

答案 0 :(得分:4)

问题是点击的按钮没有对象。你的ButtonCell创建了呈现按钮的HTML - 整列中的每个按钮都是由同一个按钮单元写的,但没有与之关联的java对象。

要直接禁用该按钮,您必须先创建一个句柄。你可以通过在你的ButtonCell创建的html中渲染一个id来做到这一点,然后从DOM中通过id获取元素。

我在类似情况下所做的只是在状态发生变化时重新渲染整个表格。它不需要那么长时间,你不需要存储任何引用(无论如何你使用CellTable而不是Grid的全部原因)。如果您知道应该禁用您的按钮,则只需将其禁用。

这两个建议都要求您对Cell对象进行子类化,以便您可以进行一些自定义渲染。这并不是很困难,但是围绕操作顺序缠头可能会令人困惑。祝你好运!

PS:如果你只是想要禁用按钮(而不是清空文本字段),我认为onBrowserEvent会为你提供一个被点击的Element的句柄 - 你可以使用它来禁用它

答案 1 :(得分:4)

我已经解决了这个问题,但最终我解决了它。

检查此代码

package com.ex7.client;

import com.google.gwt.cell.client.ButtonCell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;

public class CWButton extends ButtonCell {
    private int row = -1;
    private String alternativevalue;
    private String exTitle = "";

    private String value;
    private String title = "";

    public CWButton( ) {
        super();

    }

    @Override
    public void render(com.google.gwt.cell.client.Cell.Context context,
            String src, SafeHtmlBuilder sb) {

        if (row == -1) {
            sb.appendHtmlConstant("<button   title='" + title + "'  >" +value+"</button>");
            return;
        }

        if (row != context.getIndex()) {

            sb.appendHtmlConstant("<Button   disabled='disabled'   title='" + title + "'  >"+ value+"</button>");
        } else {
            sb.appendHtmlConstant("<button    title='" + exTitle + "' >"+ alternativevalue+"</button>");
        }

    }

    @Override
    public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context,
            Element parent, String value, NativeEvent event,
            ValueUpdater<String> valueUpdater) {

        if (row == -1 || row == context.getIndex()) {
            super.onBrowserEvent(context, parent, value, event, valueUpdater);
            return;
        }

    }

    public void setTitle(String title) {

        this.title = title;
    }

    public int getRow() {
        return row;
    }

    public String getExTitle() {
        return exTitle;
    }

    public void setExTitle(String exTitle) {
        this.exTitle = exTitle;
    }

    public void setRow(int row) {
        this.row = row;
    }

    public String getAlternativeValue() {
        return alternativevalue;
    }

    public void setAlternativeValue(String alternativeValue) {
        this.alternativevalue = alternativeValue;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}