首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT在同一列中使用不同的列类型?

GWT在同一列中使用不同的列类型?
EN

Stack Overflow用户
提问于 2011-05-09 22:02:45
回答 2查看 3K关注 0票数 5

我正在开发一个GWT应用程序,到目前为止,我很喜欢Java开发人员友好的UI框架!

到目前为止,我几乎可以用这些小部件做任何事情,但这个小部件把我难倒了。我有一个单元格表格,我将其用作用户输入源。这只是用户输入键值对来调用我的服务的一种方式。用户可以动态增行和删行。

现在棘手的部分是我想强制用户输入一些键的值。这些键只有4-5个可接受的值,所以对于这些行,我想用selectionCell替换editableTextCell。不确定如何在表中混合单元格类型,因为列单元格类型声明是在将列添加到表中时完成的。

感谢您的任何意见!

谢谢

EN

回答 2

Stack Overflow用户

发布于 2011-05-10 08:13:59

您必须创建一个自定义单元,它有时呈现<select>,有时呈现<input>。如果你看一下EditableTextCell和SelectionCell的代码,你就会得到关于如何实现这一点的想法。这可能非常简单--您可以将它们组合在一起,然后在您的render函数中只将数据传递给适当的单元格。

就像..。

代码语言:javascript
复制
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);
        }
     }
}

(未测试的代码)

票数 5
EN

Stack Overflow用户

发布于 2015-04-14 22:27:58

稍晚一点回答,但不管怎样。几天前还面临着这样的任务-文本或组合框必须用于单元格编辑的一列中。下面是我的实现:

代码语言:javascript
复制
final GridInlineEditingTextOrCombo editing = new GridInlineEditingTextOrCombo(attributeTableGrid);
    editing.addEditor(valueCol);

自定义GridInlineEditing实现如下所示:

代码语言:javascript
复制
/**
 * 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);
    }

这是一个相当好的变通方法,不是优雅的实现,但无论如何,它工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5937968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档