GWT CellTable,单击时禁用 ButtonCell

Posted

技术标签:

【中文标题】GWT CellTable,单击时禁用 ButtonCell【英文标题】:GWT CellTable, disable ButtonCell when clicked 【发布时间】:2012-01-03 15:51:53 【问题描述】:

我对 GWT 还很陌生,但到目前为止我的进步非常快。

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

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

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

我已经完成了所有这些工作。

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

我不知道如何获取实际被单击的 ButtonCell 对象的句柄或 TextInputCell 以与它们一起玩。

任何帮助表示赞赏。

bq

【问题讨论】:

【参考方案1】:

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

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

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

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

PS:如果您只是想禁用按钮(而不是清空文本字段),我认为 onBrowserEvent 为您提供了单击的Element 的句柄 - 您可以使用它来禁用它。

【讨论】:

【参考方案2】:

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

检查此代码

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;
    


【讨论】:

以上是关于GWT CellTable,单击时禁用 ButtonCell的主要内容,如果未能解决你的问题,请参考以下文章

具有复选框选择和行单击事件的 GWT CellTable

带有标签和图像的 GWT Celltable 列

GWT CellTable 种群

GWT/文本框-单击和双击处理程序选项?可能的?

将 GWT CellTable 更改提交到服务器的策略/模式

GWT 2.5.1 CellTable 和 SimplePager 问题