GXT 3.x EditorGrid:逐个单元格选择单元格编辑器类型

时间:2013-04-17 21:55:32

标签: gxt

无论如何在 GXT 3.0 中逐个单元地定义编辑器类型?

我需要创建一个转置表;列成为行,行是列。在这种情况下,列(从正常表的角度来看)将具有各种编辑器类型,其中一行将具有相同的编辑器类型。

我正在尝试使用以下方法 - 它似乎工作正常,并允许基于数据类型打开编辑器但是当我点击时;它没有关闭/隐藏编辑器。

如果有人能指出我正确的方向,我真的很感激。

final GridInlineEditing<MyModel> editing = new GridInlineEditing<MyModel>(mygrid){
        @SuppressWarnings("unchecked")
    @Override public <O> Field<O> getEditor(ColumnConfig<MyModel, ?> columnConfig) {
        if(valueColumnName.equals(columnConfig.getHeader().asString())) {
                MyModel myModel = tree.getSelectionModel().getSelectedItem();
            if(MyModelType.STRING.equals(myModel.getMyModelType())) {
                TextField textField =  new TextField();
                textField.setAllowBlank(Boolean.FALSE);
                return (Field<O>) textField;
            }
            else {
                TextArea textField =  new TextArea();
                textField.setAllowBlank(Boolean.FALSE);
                return (Field<O>) textField;
            }
        }
        return super.getEditor(columnConfig);
    }
};
editing.setClicksToEdit(ClicksToEdit.TWO);

PS: 这类似于下面的问题;但答案特定于发布GXT 3.0。我是stackoverflow的新手,似乎建议创建新问题而不是向旧线程添加新帖子。 GXT EditorGrid: choose cell editor type on a cell by cell basis

2 个答案:

答案 0 :(得分:3)

整天玩耍后;我的同事(Praveen)和我弄清楚了。因此,不要试图覆盖GridInlineEditing的getEditor()方法,而是覆盖startEditing()方法。此外,如果您有日期,列表等数据,您将需要转换器。下面是示例代码;希望这能帮到别人。

final GridInlineEditing<MyModel> editing = new GridInlineEditing<MyModel>(tree){
            @Override public void startEditing(GridCell cell) {
                MyModel myModel= tree.getSelectionModel().getSelectedItem();
                if(MyModelType.TEXT.equals(myModel.getContextVariableType())) {
                    TextArea textField =  new TextArea();
                    textField.setAllowBlank(Boolean.FALSE);
                    super.addEditor(valueColumn, textField);
                }
                else if(MyModelType.BOOLEAN.equals(myModel.getContextVariableType())) {
                    SimpleComboBox<String> simpleComboBox = new SimpleComboBox<String>(new StringLabelProvider<String>());
                    simpleComboBox.setTriggerAction(TriggerAction.ALL);
                    simpleComboBox.add("YES");
                    simpleComboBox.add("NO");
                    super.addEditor(valueColumn, simpleComboBox);
                }
                else if(MyModel.INTEGER.equals(myModel.getContextVariableType())) {
                    SpinnerField<Integer> spinnerField = new SpinnerField<Integer>(new IntegerPropertyEditor());
                    spinnerField.setIncrement(1);
                    Converter<String, Integer> converter = new Converter<String, Integer>(){
                        @Override public String convertFieldValue(Integer object) {
                            String value = "";
                            if(object != null) {
                                value = object.toString();
                            }
                            return value;
                        }
                        @Override public Integer convertModelValue(String object) {
                            Integer value = 0;
                            if(object != null && object.trim().length() > 0) {
                                value = Integer.parseInt(object);
                            }
                            return value;
                        }
                    };
                    super.addEditor(valueColumn, converter, (Field)spinnerField);
                }
                else {
                    TextField textField =  new TextField();
                    textField.setAllowBlank(Boolean.FALSE);
                    super.addEditor(valueColumn, textField);
                }
                super.startEditing(cell);
            }
        };
        editing.setClicksToEdit(ClicksToEdit.TWO);

答案 1 :(得分:0)

我认为您没有看到字段未关闭的原因是因为您实际上并未将它们添加到GridInlineEditing类。

在您有以下退货声明的部分;

return (Field<O>) textField;

这些文本字段永远不会添加到网格中。

我会尝试用以下代码替换前两个return语句;

super.addEditor(columnConfig, (Field<O>) textField;

这会将编辑器添加到AbstractGridEditing使用的某些地图中。具体而言,AbstractGridEditing.removeEditor(GridCell, Field<?>)GridInlineEditing.doCompleteEditing()中使用的GridInlineEditing.cancelEditing()方法需要该字段位于地图中,以便可以将其与其父项分离。