如何在GWT中将flextable单元格转换为可编辑文本单元格

如何在GWT中将flextable单元格转换为可编辑文本单元格,gwt,Gwt,下面是我试图使flextable的单元格可编辑的代码 flex表格加载了db值,当用户单击flextable的单元格时,它必须变得可编辑,并且用户输入的值必须存储在db中,在用户单击每行中的提交按钮后 我正在使用EditTextCell(),使单元格可编辑,但在测试时它不会变得可编辑。我已经在下面列出了我的所有代码。如果我遗漏了什么,请告诉我 private List<PendingChange<?>> pendingChanges = new ArrayList<

下面是我试图使flextable的单元格可编辑的代码

flex表格加载了db值,当用户单击flextable的单元格时,它必须变得可编辑,并且用户输入的值必须存储在db中,在用户单击每行中的提交按钮后

我正在使用EditTextCell(),使单元格可编辑,但在测试时它不会变得可编辑。我已经在下面列出了我的所有代码。如果我遗漏了什么,请告诉我

 private List<PendingChange<?>> pendingChanges = new ArrayList<PendingChange<?>>();   
private List<AbstractEditableCell<?, ?>> editableCells = new   ArrayList<AbstractEditableCell<?, ?>>();   
CellTable cellTable= new CellTable<MessageEvent>();   
EditTextCell editCell = new EditTextCell();    
protected FlexTable flextable;
//flextable creation   
private final void createWorkflows(List<MessageEvent> theWorkflowMessageEvents, boolean isSelectAll) {   
    int row = 1;      
    if (theWorkflowMessageEvents != null) {   
        for (final MessageEvent workflowMessageEvent : theWorkflowMessageEvents) {     
             flextable.getRowFormatter().setStyleName(row,ACTIVE_COLLECTION);   
                flextable.getCellFormatter().setHorizontalAlignment(row, 0, HasHorizontalAlignment.ALIGN_LEFT);   
                flextable.getCellFormatter().setWordWrap(row, 0, false);   
                flextable.setText(row, 0, workflowMessageEvent.getTransferReceived()); 
                flextable.getCellFormatter().setHorizontalAlignment(row, 1, HasHorizontalAlignment.ALIGN_LEFT);   
                flextable.getCellFormatter().setWordWrap(row, 1, false);   
                flextable.setText(row, 1, workflowMessageEvent.getLoadReceived());   
                makeFlexTableEditable() ;
Button submitButton= new Button("Submit");   
                flextable.getCellFormatter().setHorizontalAlignment(row, 3, HasHorizontalAlignment.ALIGN_LEFT);   
                flextable.getCellFormatter().setWordWrap(row, 3, false);   
                flextable.setWidget(row, 3,submitButton );   
                submitWorklow(submitButton,row, workflowMessageEvent);   
                flextable.getRowFormatter().setVisible(row, true);   
                row++;         
              }
}
 }
     //adding flextable to main panel   
protected void displayPendingWorkflows(final List<MessageEvent> theWorkflowMessageEvents) {
this.createPendingWorkflows(theWorkflowMessageEvents, false);   
//some code   
mainPanel.add(flextable);   
mainPanel.add(cellTable);   
}
//code for making flex table editable for TransferReceived column   
 private void makeFlexTableEditable() {   
         addColumn(new EditTextCell(), new GetValue() {   
                @Override  
                public String getValue(MessageEvent workflowMessageEvent) {   
                    return workflowMessageEvent.getTransferReceived();   
                }   
            }, new FieldUpdater<MessageEvent, String>() {   
                  public void update(int index, MessageEvent workflowMessageEvent, String value) {
 try { pendingChanges.add(new TransferReceived(workflowMessageEvent, value));
  }catch (Exception e) {
}
}
 });
   }  


     private <C> Column<MessageEvent, String> addColumn(EditTextCell cell,     
         final GetValue<String> getter,FieldUpdater<MessageEvent, String> fieldUpdater) {   
        Column<MessageEvent, String> transColumn = new Column<MessageEvent, String>(cell){    
            @Override     
            public String getValue(MessageEvent object) {   
                return getter.getValue(object);    
                }    
            };   
            transColumn.setFieldUpdater(fieldUpdater);    

                if (cell instanceof AbstractEditableCell<?, ?>) {   
                  editableCells.add((AbstractEditableCell<?, ?>) cell);   
            }   
            cellTable.addColumn(transColumn);   
            return transColumn;   
    }

  /**  
   * A pending change to a {@link MessageEvent}. Changes aren't committed  
   * immediately to illustrate that cells can remember their pending changes.  
   *  
   * @param <T> the data type being changed  
   */  
  private abstract static class PendingChange<T> {   
    private final MessageEvent message;   
    private final T value;   

    public PendingChange(MessageEvent message, T value) {   
      this.message = message;   
      this.value = value;   
    }   

    /**  
     * Commit the change to the contact.  
     */  
    public void commit() {   
      doCommit(message, value);   
    }   

    /**  
     * Update the appropriate field in the .  
     *  
     * @param message to update  
     * @param value the new value  
     */  
    protected abstract void doCommit(MessageEvent message, T value);   
  }   
  /**  
   * Updates the Transfered Received.  
   */  
  private static class TransferReceived extends PendingChange<String> {   

    public TransferReceived(MessageEvent message, String value) {   
      super(message, value);   
    }   

    @Override  
    protected void doCommit(MessageEvent message, String value) {   
        message.setTransferReceived(value);   
    }   
  }   

/**  
   * Get a cell value from a record.  
   *  
   * @param <C> the cell type  
   */  
  private static interface GetValue<C> {   
    C getValue(MessageEvent message);   
  } 
私有列表>();
私有列表>();
CellTable CellTable=新的CellTable();
EditTextCell editCell=新的EditTextCell();
受保护的FlexTable FlexTable;
//flextable创建
private final void createWorkflows(列出工作流消息事件,布尔值为SelectAll){
int行=1;
如果(theWorkflowMessageEvents!=null){
对于(最终消息事件workflowMessageEvent:theWorkflowMessageEvents){
flextable.getRowFormatter().setStyleName(行,活动_集合);
flextable.getCellFormatter().setHorizontalAlignment(行,0,HasHorizontalAlignment.ALIGN_左);
flextable.getCellFormatter().setWordWrap(行,0,false);
setText(行,0,workflowMessageEvent.getTransferReceived());
flextable.getCellFormatter().setHorizontalAlignment(第1行,HasHorizontalAlignment.ALIGN_左);
flextable.getCellFormatter().setWordWrap(第1行,false);
setText(第1行,workflowMessageEvent.getLoadReceived());
使FlexTableEditable();
按钮提交按钮=新按钮(“提交”);
flextable.getCellFormatter().setHorizontalAlignment(第3行,HasHorizontalAlignment.ALIGN_左);
flextable.getCellFormatter().setWordWrap(第3行,false);
setWidget(第3行,submitButton);
submitWorklow(submitButton、row、workflowMessageEvent);
flextable.getRowFormatter().setVisible(行,true);
行++;
}
}
}
//将flextable添加到主面板
受保护的无效显示挂起工作流(最终列出工作流消息事件){
此.createPendingWorkflows(工作流消息事件,false);
//一些代码
主面板。添加(flextable);
主面板。添加(单元格表);
}
//用于使TransferReceived列的flex表可编辑的代码
私有void makeFlexTableEditable(){
addColumn(新的EditTextCell(),新的GetValue(){
@凌驾
公共字符串getValue(MessageEvent workflowMessageEvent){
返回workflowMessageEvent.getTransferReceived();
}   
},新的FieldUpdater(){
public void更新(int索引、MessageEvent工作流MessageEvent、字符串值){
尝试{pendingChanges.add(newtransferReceived(workflowMessageEvent,value));
}捕获(例外e){
}
}
});
}  
专用列addColumn(EditTextCell单元格,
最终GetValue获取程序,FieldUpdater FieldUpdater){
Column transColumn=新列(单元格){
@凌驾
公共字符串getValue(MessageEvent对象){
返回getter.getValue(对象);
}    
};   
setFieldUpdater(fieldUpdater);
if(AbstractEditableCell的单元格实例){
添加((AbstractEditableCell)单元格);
}   
cellTable.addColumn(跨列);
返回跨列;
}
/**  
*对{@link MessageEvent}的挂起更改。未提交更改
*立即说明单元格可以记住其挂起的更改。
*  
*@param正在更改的数据类型
*/  
私有抽象静态类PendingChange{
私有最终消息事件消息;
私人最终T值;
公共挂起更改(MessageEvent message,T值){
this.message=消息;
这个值=值;
}   
/**  
*将更改提交给联系人。
*/  
public void commit(){
doCommit(消息、值);
}   
/**  
*更新中的相应字段。
*  
*@param要更新的消息
*@param value新值
*/  
受保护的抽象void doCommit(MessageEvent message,T值);
}   
/**  
*更新已传输的已接收的。
*/  
私有静态类TransferReceived扩展PendingChange{
公共TransferReceived(MessageEvent消息,字符串值){
超级(消息、值);
}   
@凌驾
受保护的void doCommit(MessageEvent消息,字符串值){
message.setTransferReceived(值);
}   
}   
/**  
*从记录中获取单元格值。
*  
*@param单元格类型
*/  
私有静态接口GetValue{
C getValue(MessageEvent消息);
} 

我在我的应用程序中做了类似的事情。抱歉,如果语法有点错误,但主要思想是使用clickevent,然后获取此事件位置并在该位置交换小部件

final FlexTable flexTable = new FlexTable(); flexTable.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { Cell cell = flexTable.getCellForClickEvent(event); final int row = cell.getRow(); final int column = cell.getIndex(); final TextBox textBox = new TextBox(); // Get the text from the cell in some way. Maybe use flextTable.getHTML(row, column) or what ever you prefer // textBox.setText("Something other than this"); textBox.addKeyDownHandler(new KeyDownHandler() { public void onKeyDownEvent(KeyDownEvent event) { int code = event.getNativeKeyCode(); if (KeyCodes.KEY_ENTER == code) { flexTable.setWidget(row, column, new Label(textBox.getText())); } } }); flexTable.setWidget(row, column, textBox); // You may also need something like this textBox.setFocus(true); } }); 最终FlexTable FlexTable=新FlexTable(); addClickHandler(新的ClickHandler(){ 公共作废一次点击(点击事件){ Cell Cell=flexTable.getCellForClickEvent(事件); final int row=cell.getRow(); final int column=cell.getIndex(); 最终文本框TextBox=新文本框(); //以某种方式从单元格中获取文本。可以使用flextTable.getHTML(行、列)或任何您喜欢的方式 //setText(“除此之外的其他内容”); addKeyDownHandler(新的KeyDownHandler(){ 公共无效onKeyDownEvent(KeyDownEvent事件){ int code=event.getNativeKeyCode(); if(键码