为什么 KeyEvent getCharacter 返回字符串而不是字符

Osa*_*imy 0 java events javafx keyevent event-driven

根据我的理解,getCharacter()的方法KeyEvent应该返回一个char类型。

例如,如果我必须检查键入的键是否是数字,我可以使用Character.isDigit(e.getCharacter())not Character.isDigit(e.getCharacter().charAt(0))

e.getCharacter().length()我还通过打印it always returns来检查返回字符串的长度1。该字符串有任何解释或其他用法吗?

Bas*_*que 7

KeyEvent#getCharacter()回报String

根据我的理解,KeyEvent的getCharacter()方法应该返回一个char类型。

你从哪里得到这种理解?Javadocjavafx.scene.input.KeyEvent#getCharacter()表示该方法返回String对象引用,而不是char原语。

避免char

了解这char是一种遗留类型,从 Java 2 开始,从 Java 5 开始就已经被破坏了。作为一个 16 位值, a 在char物理上无法表示Unicode中定义的 149,186 个字符中的大部分。

代码点

相反,使用代码点整数来处理单个字符。

int[] codePoints = myKeyEvent.getCharacter().codePoints().toArray() ;
Run Code Online (Sandbox Code Playgroud)

然后您可以询问这些代码点是否代表数字

boolean isDigit = Character.isDigit( myCodePoint ) ;
Run Code Online (Sandbox Code Playgroud)

示例代码

int[] codePoints = myKeyEvent.getCharacter().codePoints().toArray() ;
Run Code Online (Sandbox Code Playgroud)

请参阅在 Ideone.com 上运行的此代码。

boolean isDigit = Character.isDigit( myCodePoint ) ;
Run Code Online (Sandbox Code Playgroud)

你说:

我可以只使用Character.isDigit(e.getCharacter())

你不能。该isDigit方法采用传统char或现代代码点int。该getCharacter方法不返回其中任何一个;该方法返回 a String,如上所述。


有关背景信息,请参阅 Joel Spolsky 撰写的令人惊讶的有趣文章:每个软件开发人员绝对必须了解 Unicode 和字符集(没有任何借口!)的绝对最低限度