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