如何在GWT中禁用EditTextCell并使用EditButton单击启用它?

如何在GWT中禁用EditTextCell并使用EditButton单击启用它?,gwt,Gwt,我有一个带有EditTextCell的CellTable,EditButton在CellTable的外面。在我单击EditButton之前,CellTable将是只读的,EditTextCell将使我能够单击并编辑。有人知道怎么做吗?谢谢。您必须自己制作手机。您可以扩展EditTextCell并覆盖onBrowserEvent函数。如果已单击按钮并启用编辑功能,请调用super.onBrowserEvent。如果编辑被禁用,则不执行任何操作或显示错误消息。我的自定义类: public class

我有一个带有EditTextCell的CellTable,EditButton在CellTable的外面。在我单击EditButton之前,CellTable将是只读的,EditTextCell将使我能够单击并编辑。有人知道怎么做吗?谢谢。

您必须自己制作手机。您可以扩展
EditTextCell
并覆盖
onBrowserEvent
函数。如果已单击按钮并启用编辑功能,请调用
super.onBrowserEvent
。如果编辑被禁用,则不执行任何操作或显示错误消息。

我的自定义类:

public class ButtonEnableEditTextCell extends EditTextCell {

    private boolean click;

    @Override
    public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event,
            ValueUpdater<String> valueUpdater) {
        if (click) {
            super.onBrowserEvent(context, parent, value, event, valueUpdater);
        }
    }

    public void setClick(Boolean click) {
        this.click = click;
    }
}
公共类按钮EnableEditTextCell扩展了EditTextCell{
私有布尔点击;
@凌驾
public void onBrowserEvent(上下文上下文、元素父级、字符串值、NativeEvent事件、,
ValueUpdater(ValueUpdater){
如果(单击){
onBrowserEvent(上下文、父级、值、事件、值更新程序);
}
}
公共void集单击(布尔单击){
this.click=单击;
}
}
使用表格查看:

CellTable<Employee> employeeTable;

@UiField
Button editButton;

ButtonEnableEditTextCell sequenceCell = new ButtonEnableEditTextCell();

@UiHandler("editButton")
public void editButtonClick(ClickEvent event) {
    sequenceCell.setClick(true);
}

private void initTableColumns() {
        Column<Employee, String> sequenceColumn = new Column<Employee, String>(sequenceCell) {
            public String getValue(Employee employee) {
                return employee.getSeqNumber().toString();
            }
        };
        sequenceColumn.setFieldUpdater(new FieldUpdater<Employee, String>() {
            public void update(int index, Employee employee, String value) {
                employee.setSeqNumber(new Integer(value));
            }
        });
        employeeTable.addColumn(sequenceColumn, "Sequence Number");
}
CellTable employeeTable;
@尤菲尔德
按钮编辑按钮;
ButtonEnableEditTextCell sequenceCell=新ButtonEnableEditTextCell();
@UiHandler(“编辑按钮”)
公共作废编辑按钮单击(单击事件){
sequenceCell.setClick(true);
}
私有void initTableColumns(){
列sequenceColumn=新列(sequenceCell){
公共字符串getValue(员工){
返回employee.getSeqNumber().toString();
}
};
setFieldUpdater(新的FieldUpdater(){
公共无效更新(整数索引、雇员、字符串值){
employee.setSeqNumber(新整数(值));
}
});
employeeTable.addColumn(sequenceColumn,“序列号”);
}

我能够使用此代码启用sequenceColumn。我想知道是否有更好的方法来做这件事?

我也有类似的需要;除了希望能够在基于行值运行时更改每个单元格的可编辑性。我在EditTextCell上测试了覆盖渲染、iEdit、resetFocus和edit的各种组合(我没有尝试onBrowserEvent解决方案)

当我仅覆盖render时(如果不可编辑,则显示HTML值);我重置焦点(as)时出错。即使我超越了resetFocus,这种情况仍在继续。当我只覆盖iEdit时,单击时单元格将闪烁为编辑状态,然后返回。最有效的是覆盖编辑。我是基于向Column.getValue传递的值添加标记触发的,您可以随意触发(即基于编辑模式的一些设置),但禁用单元格的操作非常简单:

private static class LockableEditTextCell extends EditTextCell {
    @Override
    protected void edit(Context context, Element parent, java.lang.String value) {
      if (!value.startsWith(LOCKED_CELL_VALUE)) {
        super.edit(context, parent, value);
      }
    }
  }
更新:这有一个错误,如果你点击一个可编辑的单元格;然后是一个上锁的牢房;它可以让你编辑。您还必须覆盖onBrowserEvent:

@Override
public void onBrowserEvent(Context context, Element parent, String value,
    NativeEvent event, ValueUpdater<String> valueUpdater) {
  if (!value.startsWith(IncentivesColumnConfigurator.LOCKED_CELL_VALUE)) {
    super.onBrowserEvent(context, parent, value, event, valueUpdater);
  }
}
@覆盖
public void onBrowserEvent(上下文上下文、元素父级、字符串值、,
NativeEvent事件,ValueUpdater(ValueUpdater){
如果(!value.startsWith(IncentivesColumnConfigurator.LOCKED\u CELL\u value)){
onBrowserEvent(上下文、父级、值、事件、值更新程序);
}
}

谢谢您的快速回答。我知道我必须扩展EditTextCell,我希望在不扩展EditTextCell的情况下还有其他方法可以做到这一点。你有没有工作的例子?希望渺茫。非常感谢你!