我对GWT很新,但到目前为止我一直在快速进步。
我有一个单元格表,其中大部分是从RPC返回的只读数据。
我在单元格表中有两列用户可以与之交互。一个是TextInputCell,一个是ButtonCell。
当用户单击ButtonCell时,我想将该行的TextInputCell中的值发送到RPC。
我完成了所有这些工作。
我无法工作的部分是当单击按钮(ButtonCell)时,我想要禁用该行中的按钮,直到RPC返回,然后重新启用它。我还想在RPC返回时清除该行的输入单元格中的文本。
我无法弄清楚如何获取被点击的实际ButtonCell对象或TextInputCell与它们一起使用的句柄。
任何帮助表示感谢。
BQ
答案 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;
}
}