使用需要类似 CellTable 来显示和编辑数据的 GWT 应用程序。我在 CellTable 示例中没有看到的额外要求:
多个标题行。我真的不需要这样的标题行,但是每隔几行(4-10)的数据我想要一个标题之类的东西(基本上解释了下一个'n'项是如何相关的)
根据某些数据(当前日期和对象中指定的日期),某些字段应该是不可编辑的。我找到了有关如何使列不可编辑的示例,但是如何将其映射回来自自定义渲染器的实际数据?(即对应于行的数据对象 - 应该很容易,但我错过了一些东西......)
我可以用 CellTable 做到这一点吗?我应该看一个更好的小部件吗?我知道我可以在 Grid 中完成所有操作,但 CellTable 看起来要好得多!
谢谢。
回答
在下面扩展 Thomas Broyer 的答案时,我已经设法让不可编辑的东西继续下去。我从没想过“标题行”很容易,所以编辑是主要部分。
正如我在下面评论的那样,我没有找到任何简单、易于遵循的示例来向我展示整个画面。我设法从几个不同的来源拼凑起来。
如果有人有任何意见或我遗漏了一些明显的东西:请告诉我!
// Step 1: Create a cell (in this case based on text)
class MyEditTextCell extends EditTextCell {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context,
String value, SafeHtmlBuilder sb)
{
bool editable = true;
// TODO: What goes here?
if (!editable) {
sb.appendHtmlConstant("<div contentEditable='false' unselectable='true'>" + value + "</div>");
}
else {
super.render(context, value, sb);
}
}
}
// It gets used to add a column to the table like this
final MyEditTextCell myCell = new MyTextCell();
Column<RowType, String> nmyCol = new Column<RowType, String>(myCell) {
@Override
public String getValue(RowType o) {
return o.someMethod(); // This gets the particular row out of your column.
}
};
table.addColumn(myCol, "Heading");
所以所有这些工作都相当容易,但我仍然无法弄清楚使用该行的 TODO。这一切都与另一个处理 KeyProviders 的示例结合在一起。KeyProvider 提供了一个链接,该链接来自您在单元格的 render() 方法中获得的 Context 以及该单元格所属的行。它通过一个索引(它只是一个对象)来做到这一点。
所以你最终得到:
// Step 2: Cell can get the row and use it to decide how to draw.
class MyEditTextCell extends EditTextCell {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context,
String value, SafeHtmlBuilder sb)
{
Object key = context.getKey();
// What the key is is uo to you: if could be an Integer that indexes into
// a collection of objects, it could be a key for a hashmap. I'm guessing
// it could even be the real object itself (but I haven't tried that...)
// e.g.
boolean editable = true;
int index = ((Integer)key).intValue();
RowType row = myRowCollection.get(index);
if (row != null) {
if (/*some condition on the row*/) {
editable = false;
}
}
if (!editable) {
sb.appendHtmlConstant("<div contentEditable='false' unselectable='true'>" + value + "</div>");
}
else {
super.render(context, value, sb);
}
}
}
// Key provider links gets a unique id from the rows - I just used an in.
// This gets provided to the CellTable on creation
// e.g. CellTable tab = new CellTable(LEY_PROVIDER);
//
private static final ProvidesKey<RowType> KEY_PROVIDER = new ProvidesKey<RowType>() {
public Object getKey(RowType item) {
return Integer.valueOf(item.getId());
}
};