3

无论如何在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:逐个单元格选择单元格编辑器类型

4

2 回答 2

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);
于 2013-04-18T20:01:23.320 回答
0

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

在您有以下返回语句的部分;

return (Field<O>) textField;

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

我会尝试将以下代码替换为您的前两个 return 语句;

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

这会将编辑器添加到AbstractGridEditing. 具体来说,该AbstractGridEditing.removeEditor(GridCell, Field<?>)方法用于GridInlineEditing.doCompleteEditing()并且GridInlineEditing.cancelEditing()需要该字段位于地图中,以便可以将其与其父级分离。

于 2013-04-18T15:32:43.637 回答