1

我已经创建了一个自定义 CellTable 标题,如该线程中所述: CellTable with custom Header contains SearchBox and Focus Problem

为了解决焦点问题,我使用 change 事件而不是 keyup 事件来触发过滤,因此过滤器现在仅在过滤器框失去焦点或按下 Enter 键时触发。

我遇到的唯一问题是过滤框不接受空格(keycode=32)。有人遇到这种情况吗?

4

4 回答 4

2

我发现作为 CellTable 的父类之一的 AbstractHasData 类使用 SPACE、HOME、END、ARROW UP 和 ARROW DOWN 进行表格导航,这可以防止这些键在单元格上执行其默认功能。

仅当 cellIsEditing 为 TRUE 时,键盘导航才会被抑制,这仅在表格主体上的单元格处于焦点且处于编辑模式时才会发生。

不幸的是,由于 CellTable 最初不支持表头上的输入框,因此也不支持表头上的 cellIsEditing。

作为一种解决方法,我在自己的 CellTable 类扩展中创建了一个私有字段 headerIsEditing,默认设置为 FALSE。然后我重写了 onBrowserEvent2 方法,当过滤器输入框处于焦点时将 headerIsEditing 设置为 TRUE,并在同一框的模糊事件发生时将其设置为 FALSE。

然后我覆盖了 isKeyboardNavigationSuppressed ,如下所示:

@Override
protected boolean isKeyboardNavigationSuppressed() {
    return super.isKeyboardNavigationSuppressed() || headerIsEditing;
}

这样,当 cellIsEditing 为 TRUE 或 headerIsEditing 为 TRUE 时,键盘导航将被抑制。

于 2012-05-04T01:51:11.760 回答
0

的对象具有com.google.gwt.event.dom.client.DomEventKeyUpEvent中的方法getNativeEvent()

使用它你应该没有任何问题:

if (event.getNativeEvent().getKeyCode() == 32) { 
       // TODO
}  

可能是其他地方的原因。

于 2012-05-02T07:47:43.300 回答
0

我能够解决这个问题,在 Andrey 指出的浏览器事件中,我有这个代码:

public void onBrowserEvent(Context context, Element parent, C value,
    NativeEvent event, ValueUpdater<C> valueUpdater) {
if (value == null) return;

String eventType = event.getType();

GWT.log(eventType);

super.onBrowserEvent(context, parent, value, event, valueUpdater);

InputElement input = getInputElement(parent);

if ("change".equals(eventType)) {
    ((HeaderFilterDto) value).setFilterValue(input.getValue());
    if (valueUpdater != null) valueUpdater.update(value);
} else if ("keyup".equals(eventType) && event.getKeyCode() == 32) {
    insertSpaceToCursorPosition(input);
}
};

然后我有这个方法在光标位置插入空格:

protected void insertSpaceToCursorPosition(InputElement input) {
if (StringUtils.isNotBlank(input.getValue())) {
    int length = input.getValue().length();
    int pos = getCursorPos(input);
    int selected = getSelectionLength(input);

    String sub1 = input.getValue().substring(0, pos);
    String sub2 = input.getValue().substring(selected == 0 ? pos: pos + selected, length);

    input.setValue(sub1 + SPACE + sub2);

    setSelectionRange(input, pos);
} else {
    input.setValue(SPACE);
    setSelectionRange(input, 0);
}
}

insertSpaceToCursorPosition 中的方法是从 TextBoxImpl.class 的 ValueBoxBase 实现中设计的。

于 2012-05-03T02:25:30.693 回答
0

我解决了这个问题,修复了KeyProvider传递给CellTable.

如果您KeyProvider是基于为空的字段实现的,则可能会发生此问题,该字段com.google.gwt.cell.client.AbstractInputCell#isEditing返回false然后SPACEBAR键用作导航单元格。

于 2015-10-28T13:36:40.573 回答