为什么不将keypress事件发送到GWT的TextInputCell.onBrowserEvent()方法?

时间:2011-01-19 17:32:47

标签: java gwt

问题:

我正在覆盖GWT TextInputCell.onBrowserEvent()方法,尝试对输入到字段中的字符应用过滤。如何才能获得用户在keydown事件中输入的实际字符?

我尝试了什么:

我可以使用NativeEvent.getKeyCode()方法来获取密钥代码,但这还不够,因为我想知道他们输入的特定字符,所以我可以将字符与常规表达进行比较。据我了解,keyCode只是告诉我他们在键盘上键入的键,所以我不能区分大写'A'和小写'a'。我也可以从InputElement事件的keyup中获取值,但这已经太晚了,因为该角色已经被渲染到UI元素。

当我调用NativeEvent.getCharCode()时,它会为我键入的任何字符返回0。我在Chrome和Firefox上试过这个。为什么getCharCode()总是返回0?这是一个错误吗?

例如,这是我尝试的内容以及键盘上输入数字“1”时得到的值:

event.getKeyCode() - 49
event.getCharCode() - 0
Character.toChars(event.getCharCode())[0] - (a box character because charCode was 0)
String.valueOf(Character.toChars(event.getCharCode())) - (a box character because charCode was 0)
String.valueOf((char) event.getKeyCode()) - 1

更新

好的,所以我看到我需要捕获keypress事件而不是keydown,但是我打印出每个event.getType()值,因为我键入的每个事件都发生了看到触发了一个keypress事件。所以我更新的问题是,keypress事件发生的原因是什么?如果我无法在TextInputCell.onBrowserEvent()方法中捕获它,是否有不同的方法来捕获TextInputCell

2 个答案:

答案 0 :(得分:2)

因此,事实证明,AbstractCell采用了表示“consumeEvents”的字符串列表。这基本上限制了子单元类可以处理的事件类型。 TextInputCell传递change和keyup事件类型。 AbstractInputCell添加焦点,模糊和keydown。因此,TextInputCell无法处理keypress本机事件。

我最终在我自己的项目中创建了一个近乎精确的TextInputCell副本,并将keypress类型添加到构造函数中。然后我能够抓住事件并进行我想要做的过滤。我将在GWT中创建一个请求,将此功能添加到TextInputCell。

我还创建了一个功能请求,将此功能添加到GWT:http://code.google.com/p/google-web-toolkit/issues/detail?id=5891

答案 1 :(得分:0)

有关密钥代码与字符代码的解释,请参阅this question

要检测'A'与'a',您可能需要检查NativeEvent.getShiftKey()方法,该方法将告诉您是否按下了shift键。请注意,还有NativeEvent.getCtrlKey()和NativeEvent.getMetaKey()方法。