我创建了tableviewer(jface)。
所有列都可编辑(使用EditingSupport)
我想保存表格中的更改。
我添加了一个保存按钮。
我试过的问题是改变单元格中的值(焦点仍然在单元格上)我按保存并且我想读取更改的值。我总是看到旧值而不是新值的问题
如果我更改了单元格的焦点,那么它正在工作。
我是否需要在单元格中添加用于编辑的事件?
这是我的代码
//保存按钮的逻辑
saveButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
TableItem item = this.getTable().getItem(selectionIndex);
// gridViewer类
public class MyGridViewer extends TableViewer {
public MyGridViewer (Composite parent) {
super(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
final Table table = this.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
this.setContentProvider(new MyModelProvider());
}
}
@Override
protected void inputChanged(Object input, Object oldInput) {
removeColumn();
tableCol = new TableViewerColumn(this, SWT.NONE);
column = tableCol.getColumn();
column.setText(dataColumnHeader.getName());
column.setWidth(100);
column.setResizable(true);
column.setMoveable(true);
tableCol.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
DataRow r = (DataRow) element;
DataCell c = r.getDataCellByName(dataColumnHeader.getName());
if (c != null && c.getValue() != null) {
return c.getValue().toString();
}
return null;
}
});
editingSupport = new StringCellEditingSupport(this, dataColumnHeader);
tableCol.setEditingSupport(editingSupport);
super.inputChanged(input, oldInput);
}
//编辑单元格类
public class StringCellEditingSupport extends EditingSupport {
private final TableViewer tableViewer;
private final DataColumnHeader column;
private final StringCellEditor cellEditor;
public StringCellEditingSupport(TableViewer viewer, DataColumnHeader dataColumnHeader) {
super(viewer);
this.tableViewer = viewer;
this.cellEditor = new StringCellEditor(tableViewer.getTable(), SWT.BORDER);
this.column = dataColumnHeader;
}
@Override
protected StringCellEditor getCellEditor(Object element) {
return cellEditor;
}
@Override
protected boolean canEdit(Object element) {
return true;
}
@Override
protected Object getValue(Object element) {
if(element instanceof DataRow) {
DataRow dataRow = (DataRow) element;
DataCell cell = dataRow.getDataCellByName(this.column.getName());
return cell.getValue();
}
return null;
}
@Override
protected void setValue(Object element, Object value) {
if (element instanceof DataRow && value instanceof String) {
DataRow dataRow = (DataRow) element;
DataCell cell = dataRow.getDataCellByName(this.column.getName());
cell.setValue(value);
tableViewer.update(element, null);
}
}
}