【问题标题】:Eclipse Scout Neon Focus inside rows after import data导入数据后行内的 Eclipse Scout Neon Focus
【发布时间】:2016-10-08 13:56:14
【问题描述】:

我的表单上有一些依赖层次结构,所以我在侦察器的服务器端实现了层次结构检查。如果一个字段被更改,它会触发检查其他字段是否也需要更改。这是通过导出/导入表单数据完成的。

MyFormData input = new MyFormData();
FormDataUtility.exportFormData(this, input);
input = BEANS.get(IMYService.class).validate(input, field);
FormDataUtility.importFormFieldData(this, input, false, null, null);

验证函数更改所有其他需要更改的字段。

我的问题是在可编辑表格中编辑单元格。

如果我更改单元格中的值,并触发此链验证,则在导入表单数据后,我会失去单元格中的焦点。因此,选项卡会将我移动到另一个单元格,选项卡触发器导入和单元格中的焦点丢失。这是一个非常糟糕的用户体验。

如何解决这个问题? 调用导入后如何保持焦点(下一个单元格)?

马尔科

【问题讨论】:

    标签: import cell eclipse-scout lost-focus


    【解决方案1】:

    我不确定这是否适用于您,但您可以尝试以下方法:
    我假设您在列类的execCompleteEdit(ITableRow row, IFormField editingField) 中执行导出/验证/导入逻辑。我建议,您自己计算下一个可聚焦单元格,并在导入表单数据后请求其焦点。
    例如,您可以这样做:

        @Override
        protected void execCompleteEdit(ITableRow row, IFormField editingField) {
           super.execCompleteEdit(row, editingField);
           // create form data object
           // export form data
           // call service and validate
           // import form data
           // request focus for next cell
           focusNextAvailableCell(this, row);
        }
    


    focusNextAvailableCell(this, row) 如下:

    private void focusNextAvailableCell(IColumn<?> col, ITableRow row) {
        if (col == null || row == null) {
            return;
        }
        IColumn<?> nextColumn = getColumnSet().getColumn(col.getColumnIndex()+1);
        ITableRow nextRow = getTable().getRow(row.getRowIndex());
        if (nextColumn == null) {
            // no next column (last column lost focus)
            // check if next row is available
            nextRow = getTable().getRow(row.getRowIndex()+1);
            // maybe select first cell again?
            if (nextRow == null) {
                nextColumn = getColumnSet().getColumn(0);
                nextRow = getTable().getRow(0);
            }
        }
    
        if (nextColumn != null && nextRow != null) {
            getTable().requestFocusInCell(nextColumn, nextRow);
        }
    }
    

    您应该知道,在您的列的execCompleteEdit 方法中每次导入表单数据后都必须调用它。此外,这不仅在通过按 Tab 键切换单元格时触发,而且在使用鼠标按钮单击时触发。

    最好的问候!

    【讨论】:

    • 这对我来说不合适,因为您的最后一条评论。 execCompleteEdit 总是在离开单元格时触发。在这种情况下,我无法在表单中选择另一个字段,因为焦点将返回到下一个单元格。是否可以记住当前的焦点。如果我理解 super.execCompleteEdit(row, editingField);应该将焦点移到下一个单元格或另一个字段,因此在导入此字段后应该再次聚焦。
    • 您可以将当前聚焦的单元格保存到成员变量中。例如,您可以在表(org.eclipse.scout.rt.client.ui.basic.table.TableListener)上注册一个监听器,监听 TableEvent.TYPE_REQUEST_FOCUS_IN_CELL 事件并保存当前关注的单元格。
    • 这可能没问题,但我不知道如何为 TableEvent.TYPE_REQUEST_FOCUS_IN_CELL 设置监听器。现在在 fireTableEventInternal TYPE_ROWS_SELECTED 被触发。
    • 好的。我刚刚看到,只有 AbstractTable.requestFocusInCell(IColumn>, ITableRow) 触发了一个 fireRequestFocusInCell(...) 事件,它最终允许您监听 TableEvent.TYPE_REQUEST_FOCUS_IN_CELL。如果您不手动调用 AbstractTable 中的 requestFocusInCell,则不会触发 TYPE_REQUEST_FOCUS_IN_CELL 事件(至少我没有)。但是,您可以将当前聚焦的单元格保存在 AbstractColumn.execPrepareEdit(ITableRow) 或 AbstractColumn.execCompleteEdit(ITableRow, IFormField) 中。但是你必须在每一列中覆盖它......
    • 这对我不起作用,因为 AbstractColumn.execPrepareEdit 不会在下一个单元格上调用,因为它被表单数据导入中断。
    猜你喜欢
    • 2016-10-09
    • 2016-07-08
    • 2016-07-09
    • 2016-06-29
    • 2016-04-24
    • 2016-10-09
    • 1970-01-01
    • 2016-09-22
    • 2016-07-16
    相关资源
    最近更新 更多