我已经创建了一个自定义 CellTable 标题,如该线程中所述: CellTable with custom Header contains SearchBox and Focus Problem
为了解决焦点问题,我使用 change 事件而不是 keyup 事件来触发过滤,因此过滤器现在仅在过滤器框失去焦点或按下 Enter 键时触发。
我遇到的唯一问题是过滤框不接受空格(keycode=32)。有人遇到这种情况吗?
我已经创建了一个自定义 CellTable 标题,如该线程中所述: CellTable with custom Header contains SearchBox and Focus Problem
为了解决焦点问题,我使用 change 事件而不是 keyup 事件来触发过滤,因此过滤器现在仅在过滤器框失去焦点或按下 Enter 键时触发。
我遇到的唯一问题是过滤框不接受空格(keycode=32)。有人遇到这种情况吗?
我发现作为 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 时,键盘导航将被抑制。
的对象具有com.google.gwt.event.dom.client.DomEvent类KeyUpEvent
中的方法getNativeEvent()
使用它你应该没有任何问题:
if (event.getNativeEvent().getKeyCode() == 32) {
// TODO
}
可能是其他地方的原因。
我能够解决这个问题,在 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 实现中设计的。
我解决了这个问题,修复了KeyProvider
传递给CellTable
.
如果您KeyProvider
是基于为空的字段实现的,则可能会发生此问题,该字段com.google.gwt.cell.client.AbstractInputCell#isEditing
返回false
然后SPACEBAR
键用作导航单元格。