我正在开发一个GWT应用程序,到目前为止,我很喜欢Java开发人员友好的UI框架!
到目前为止,我几乎可以用这些小部件做任何事情,但这个小部件把我难倒了。我有一个单元格表格,我将其用作用户输入源。这只是用户输入键值对来调用我的服务的一种方式。用户可以动态增行和删行。
现在棘手的部分是我想强制用户输入一些键的值。这些键只有4-5个可接受的值,所以对于这些行,我想用selectionCell替换editableTextCell。不确定如何在表中混合单元格类型,因为列单元格类型声明是在将列添加到表中时完成的。
感谢您的任何意见!
谢谢
发布于 2011-05-10 08:13:59
您必须创建一个自定义单元,它有时呈现<select>,有时呈现<input>。如果你看一下EditableTextCell和SelectionCell的代码,你就会得到关于如何实现这一点的想法。这可能非常简单--您可以将它们组合在一起,然后在您的render函数中只将数据传递给适当的单元格。
就像..。
public class ChoosyCell extends AbstractCell<YourData> {
SelectionCell selectCell = new SelectionCell<YourData>();
EditableTextCell textCell = new EditableTextCell<YourData>();
public void render(Context context, YourData data, SafeHtmlBuilder sb) {
if (data.isTheLimitedType()) {
selectCell.render(context, data, sb);
} else {
textCell.render(context,data, sb);
}
}
}(未测试的代码)
发布于 2015-04-14 22:27:58
稍晚一点回答,但不管怎样。几天前还面临着这样的任务-文本或组合框必须用于单元格编辑的一列中。下面是我的实现:
final GridInlineEditingTextOrCombo editing = new GridInlineEditingTextOrCombo(attributeTableGrid);
editing.addEditor(valueCol);自定义GridInlineEditing实现如下所示:
/**
* Class intended to create GridInlineEditing functionality,
* but with two type of editors in one column - TextField or SimpleComboBox,
* depending of SnmpParameterDefDTO.getAllowedValues().
*/
class GridInlineEditingTextOrCombo extends GridInlineEditing<SnmpParameterDefDTO> {
IsField<String> textField = new TextField();
SimpleComboBox<String> simpleComboBox = new SimpleComboBox<String>(new StringLabelProvider<String>());
Grid.GridCell currentCell = null;
private boolean currentCellChanged = false;
IsField<String> currentCellEditor;
//ComboBox<String> comboBox = new ComboBox<String>();
public GridInlineEditingTextOrCombo(Grid<SnmpParameterDefDTO> editableGrid) {
super(editableGrid);
simpleComboBox.setEditable(false);
simpleComboBox.setAllowTextSelection(false);
simpleComboBox.setTriggerAction(ComboBoxCell.TriggerAction.ALL);
}
@Override
@SuppressWarnings("unchecked")
public <O> IsField<O> getEditor(ColumnConfig<SnmpParameterDefDTO, ?> columnConfig) {
IsField<O> field = super.getEditor(columnConfig);
if(field!=null ){
if(!currentCellChanged){
return (IsField<O>)currentCellEditor;
}else{
currentCellChanged = false;
SnmpParameterDefDTO param = this.editableGrid.getStore().get(this.currentCell.getRow());
if(param.getAllowedValues() == null || param.getAllowedValues().size() == 0){
currentCellEditor = (IsField<String>)field;
}else{
simpleComboBox.getStore().clear();
simpleComboBox.add(param.getAllowedValues());
currentCellEditor = simpleComboBox;
}
return (IsField<O>)currentCellEditor;
}
}
return null;
}
@Override
public <T> void addEditor(ColumnConfig<SnmpParameterDefDTO, T> columnConfig, IsField<T> field) {
throw new RuntimeException("You can not call this method. Please use addEditor(ColumnConfig<SnmpParameterDefDTO, T> columnConfig) instead");
}
public <T> void addEditor(ColumnConfig<SnmpParameterDefDTO, T> columnConfig) {
super.addEditor(columnConfig, (IsField<T>)textField);
}
@Override
public void startEditing(Grid.GridCell cell){
currentCell = cell;
currentCellChanged = true;
super.startEditing(cell);
}这是一个相当好的变通方法,不是优雅的实现,但无论如何,它工作得很好。
https://stackoverflow.com/questions/5937968
复制相似问题