Java GWT CellTable或类似产品
在GWT应用程序上工作,它需要类似CellTable的东西来显示和编辑数据。我在CellTable示例中没有看到的额外要求:Java GWT CellTable或类似产品,java,gwt,Java,Gwt,在GWT应用程序上工作,它需要类似CellTable的东西来显示和编辑数据。我在CellTable示例中没有看到的额外要求: 多个标题行。我并不真的需要这样的标题行,但每隔几行(4-10行)的数据我就会想要类似标题的东西(基本上解释了下一个“n”项是如何关联的) 基于某些数据(当前日期和对象中指定的日期),某些字段应该是不可编辑的。我已经找到了如何使列不可编辑的示例,但是如何将其映射回自定义渲染器中的实际数据?(即,对应于行的数据对象-应该很简单,但我遗漏了一些东西…) 我能用手机台做这个吗
- 多个标题行。我并不真的需要这样的标题行,但每隔几行(4-10行)的数据我就会想要类似标题的东西(基本上解释了下一个“n”项是如何关联的)
- 基于某些数据(当前日期和对象中指定的日期),某些字段应该是不可编辑的。我已经找到了如何使列不可编辑的示例,但是如何将其映射回自定义渲染器中的实际数据?(即,对应于行的数据对象-应该很简单,但我遗漏了一些东西…)
// 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");
//步骤1:创建单元格(本例中基于文本)
类MyEditTextCell扩展了EditTextCell{
@凌驾
public void render(com.google.gwt.cell.client.cell.Context),
字符串值,安全HtmlBuilder sb)
{
bool=true;
//托多:这里有什么?
如果(!可编辑){
sb.附加HtmlConstant(“+value+”);
}
否则{
超级渲染(上下文、值、sb);
}
}
}
//它用于向表中添加一列,如下所示
最终MyEditTextCell myCell=新MyTextCell();
列nmyCol=新列(myCell){
@凌驾
公共字符串getValue(行类型o){
return o.someMethod();//这将从列中获取特定的行。
}
};
表.添加栏(麦可尔,“标题”);
因此,所有这些都很容易实现,但我仍然无法找出使用该行的方法。它与另一个处理密钥提供者的示例一起使用。KeyProvider提供了一个来自单元格的render()方法中获得的上下文和单元格所属行的链接。它通过一个索引(它只是一个对象)来实现这一点
因此,你最终会:
// 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());
}
};
//步骤2:单元格可以获取行并使用它来决定如何绘制。
类MyEditTextCell扩展了EditTextCell{
@凌驾
public void render(com.google.gwt.cell.client.cell.Context),
字符串值,安全HtmlBuilder sb)
{
Object key=context.getKey();
//关键是uo:if可以是一个索引到
//一组对象,它可能是hashmap的一个键。我猜
//它甚至可能是真实的对象本身(但我没有尝试过…)
//例如。
布尔可编辑=真;
int index=((整数)键).intValue();
RowType row=myRowCollection.get(索引);
如果(行!=null){
if(/*行上的某些条件*/){
可编辑=假;
}
}
如果(!可编辑){
sb.附加HtmlConstant(“+value+”);
}
否则{
超级渲染(上下文、值、sb);
}
}
}
//键提供程序链接从行中获取唯一id-我刚才在中使用了一个。
//这将在创建时提供给CellTable
//例如,CellTable选项卡=新的CellTable(LEY_提供者);
//
私有静态最终ProvidesKey\u PROVIDER=新ProvidesKey(){
公共对象getKey(行类型项){
返回Integer.valueOf(item.getId());
}
};
- 多个标题行。我并不真的需要这样的标题行,但每隔几行(4-10行)的数据我就会想要类似标题的东西(基本上解释了下一个“n”项是如何关联的)
GWT 2.5(大约一个月后发布)将添加
CellTableBuilder
,允许您更改CellTable
从其模型构建视图的方式。您可以在这里看到一个示例(与您的用例不同:添加子行而不是分组行):
在您的例子中,棘手的部分是检测何时插入分组行
- 基于某些数据(当前日期和对象中指定的日期),某些字段应该是不可编辑的。我已经找到了如何使列不可编辑的示例,但是如何将其映射回自定义渲染器中的实际数据?(即,对应于行的数据对象-应该很简单,但我遗漏了一些东西…)
单元格
,该单元格接受一个行对象值(这样它就可以决定该单元格是否可编辑),但只显示/编辑该对象的字段/属性。如果值是可编辑的,您应该能够将渲染和事件处理延迟到
TextInputCell
或EditTextCell
,否则延迟到TextCell
棘手的部分是,使列可编辑的条件是否取决于自身可编辑的属性。在这种情况下,您必须触发表的刷新(至少是修改的行),以便刷新有条件可编辑的列。在这种情况下,我认为使用自定义的
单元格
会有更好的机会,它最初总是呈现相同的内容,但可以切换到可编辑模式(类似于编辑文本单元格
);并在处理事件时进行该值的可编辑计算,并有条件地拒绝切换到编辑模式。您应该可以从这里的
EditTextCell
复制/粘贴大量内容。谢谢您的回答-稍后再试。GWT2.5示例看起来很简单