我们可以在GWT的同一列上同时使用ClickableTextCell和ButtonCell吗?
好的,我有一个我们可以在GWT的同一列上同时使用ClickableTextCell和ButtonCell吗?,gwt,gwtp,Gwt,Gwtp,好的,我有一个IndexedColumn public class IndexedColumn extends Column<List<String>, String>{ public IndexedColumn(int index){ super(new ClickableTextCell()); // by default it is ClickableTextCell } } 运行后,它可以选择getView().getRes().c
IndexedColumn
public class IndexedColumn extends Column<List<String>, String>{
public IndexedColumn(int index){
super(new ClickableTextCell()); // by default it is ClickableTextCell
}
}
运行后,它可以选择getView().getRes().css().redColor()
,但没有选择getView().getRes().css().gwtCellButton()
是否可以在同一列上同时使用ClickableTextCell和ButtonCell,如果可以,那么如何操作?您必须为两个类(即TextCell和ButtonCell)实现
HasCell
接口,然后使用CompositeCell
将两个(或更多)单元格组合在一起
使用以下类别:
public abstract class CustomTextCell<T> extends AbstractCell<String> {
private T object;
private Set<String> set ;
@Override
public Set<String> getConsumedEvents() {
set = new HashSet<String>();
set.add("click");
set.add("keydown");
return set;
}
public void setObject(T object) {
this.object = object;
}
@Override
protected void onEnterKeyDown(Context context, Element parent, String value,
NativeEvent event, ValueUpdater<String> valueUpdater) {
doAction(value, valueUpdater,object);
}
@Override
public void onBrowserEvent(Context context, Element parent,
String value, NativeEvent event,
ValueUpdater<String> valueUpdater) {
super.onBrowserEvent(context, parent, value, event, valueUpdater);
if ("click".equals(event.getType())) {
EventTarget eventTarget = (EventTarget) event.getEventTarget();
if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
doAction(value, valueUpdater,object);
}
}
}
protected abstract void doAction(String value, ValueUpdater<String> valueUpdater,T object);
公共抽象类CustomTextCell扩展了AbstractCell{
私人T对象;
私有集;
@凌驾
公共集getConsumedEvents(){
set=新的HashSet();
设置。添加(“单击”);
设置。添加(“键控”);
返回集;
}
公共无效集合对象(T对象){
this.object=对象;
}
@凌驾
受保护的void onEnterKeyDown(上下文上下文、元素父元素、字符串值、,
NativeEvent事件,ValueUpdater(ValueUpdater){
doAction(值、值更新程序、对象);
}
@凌驾
public void onBrowserEvent(上下文、元素父级、,
字符串值,NativeEvent事件,
ValueUpdater(ValueUpdater){
onBrowserEvent(上下文、父级、值、事件、值更新程序);
如果(“单击“.equals(event.getType())){
EventTarget EventTarget=(EventTarget)event.getEventTarget();
if(parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))){
doAction(值、值更新程序、对象);
}
}
}
受保护的抽象void doAction(字符串值、ValueUpdater ValueUpdater、T对象);
下面的类实现了HasCell接口
public abstract class ClickableTextCellHasCellImpl<T> implements HasCell<T, String> {
private FieldUpdater<T, String> fieldUpdater;
private T object;
private CustomTextCell<T> cell = new CustomTextCell<T>() {
@Override
protected void doAction(String value,
ValueUpdater<String> valueUpdater, T object) {
onTextClick(object);
}
@Override
public void render(com.google.gwt.cell.client.Cell.Context context,
String value, SafeHtmlBuilder sb) {
sb.appendHtmlConstant("<h4>"+ getValue(object)+"</h4>");
}
};
protected abstract void onTextClick(T object);
@Override
public Cell<String> getCell() {
return cell;
}
@Override
public FieldUpdater<T, String> getFieldUpdater() {
return fieldUpdater;
}
public void setFieldUpdater(FieldUpdater<T, String> fieldUpdater){
this.fieldUpdater=fieldUpdater;
}
@Override
public abstract String getValue(T object);
public void setObjectValue(T object){
this.object = object;
cell.setObject(object);
}
}
公共抽象类ClickableTextCellHasCellImpl实现HasCell{
私有FieldUpdater FieldUpdater;
私人T对象;
私有CustomTextCell单元格=新CustomTextCell(){
@凌驾
受保护的无效操作(字符串值,
ValueUpdater ValueUpdater,T对象){
onTextClick(对象);
}
@凌驾
public void render(com.google.gwt.cell.client.cell.Context),
字符串值,安全HtmlBuilder sb){
sb.appendHtmlConstant(“+getValue(object)+”);
}
};
受保护的抽象void onTextClick(T对象);
@凌驾
公共单元getCell(){
返回单元;
}
@凌驾
公共字段更新程序getFieldUpdater(){
返回字段更新程序;
}
public void setFieldUpdater(FieldUpdater FieldUpdater){
this.fieldUpdater=fieldUpdater;
}
@凌驾
公共抽象字符串getValue(T对象);
公共无效setObjectValue(T对象){
this.object=对象;
cell.setObject(object);
}
}
您也可以为按钮创建类似的类。对于ButtonHasCellImpl,只需将渲染方法更改为:
@Override
public void render(com.google.gwt.cell.client.Cell.Context context,
String value, SafeHtmlBuilder sb) {
sb.appendHtmlConstant("<button type=\"button\">"+ getValue(object)+"</button>");
}
@覆盖
public void render(com.google.gwt.cell.client.cell.Context),
字符串值,安全HtmlBuilder sb){
sb.appendHtmlConstant(“+getValue(object)+”);
}
最后将它们添加到复合单元格中:
CompositeCell compositeCell = new CompositeCell(hasCellImplLst);
Column<MyObject, String> compColum = new Column<MyObject, String>(compositeCell) {
@Override
public String getValue(MyObject object) {
textCell.setObjectValue(object);
buttonCell.setObjectValue(object);
return null;
}
};
CompositeCell-CompositeCell=新的CompositeCell(hasCellImplLst);
列组件=新列(compositeCell){
@凌驾
公共字符串getValue(MyObject对象){
textCell.setObjectValue(对象);
buttonCell.setObjectValue(对象);
返回null;
}
};
总而言之,您必须使用一个复合单元,而复合单元又使用一个HasCell实现列表。我们能有一个更简单的解决方案吗?
@Override
public void render(com.google.gwt.cell.client.Cell.Context context,
String value, SafeHtmlBuilder sb) {
sb.appendHtmlConstant("<button type=\"button\">"+ getValue(object)+"</button>");
}
CompositeCell compositeCell = new CompositeCell(hasCellImplLst);
Column<MyObject, String> compColum = new Column<MyObject, String>(compositeCell) {
@Override
public String getValue(MyObject object) {
textCell.setObjectValue(object);
buttonCell.setObjectValue(object);
return null;
}
};