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的主要内容,如果未能解决你的问题,请参考以下文章