一个小需求:在下拉组合框中输入数字。
写代码的时候考虑了一下是使用keydown还是keypress,也就是此时想深入写一篇文章,关于keydown和keypress的区别,还有代码中涉及的两个函数:KeyCode和KeyAscii,另外和Java中的相关内容做一个对比学习。
先看这个小例子的实现:
Private Sub Combo1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then ' 判断是否按下回车键
Combo1.AddItem Combo1.Text ' 将文本框内容添加到组合框中
Combo1.Text = "" ' 清空文本框内容
End If
End Sub
*使用keyPress
Private Sub Combo1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Combo1.AddItem Combo1.Text
Combo1.SelStart = 0
Combo1.SelLength = Len(Combo1.Text)
Text1.Text = Combo1.ListCount
End If
在编程中,我们常常需要获取按键的值来进行相应的处理。在 Visual Basic中,有两个与按键相关的函数:KeyCode 和 KeyAscii。
这里要注意非字符键是没有ASCII 值的。
因为 ASCII是一种将字符与其对应的数字编码相互映射的标准。它只定义了 0 到 127 之间的字符编码,用于表示英文字符、数字和一些基本的符号。然而,功能键、控制键等非字符键并不属于这个字符集范围内,因此它们没有相应的 ASCII 值。
相反,非字符键通常被映射为一个数值键码,也就是KeyCode,在 KeyDown 或 KeyUp 事件中可以使用这个键码来识别非字符键。不同的编程语言和操作系统可能会有自己的键码映射表,可以参考相应的文档或运行时库来获取特定按键的键码值。
所以,在处理非字符键时,应使用 KeyDown 或 KeyUp 事件配合 KeyCode 值进行判断,而不是使用 KeyPress 事件和 ASCII 值。
在VB中,可以使用 KeyCode 来获取按键的键码值,使用 KeyAscii 来获取按键的 ASCII 码值。以下是一个简单的示例代码:
Private Sub TextBox1_KeyDown(KeyCode As Integer, Shift As Integer)
Dim asciiValue As Integer
asciiValue = KeyAscii
' 判断按下的键是否是可打印字符
If asciiValue > 0 And asciiValue < 127 Then
' 处理可打印字符
' ...
Else
' 处理不可打印字符
' ...
End If
End Sub
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class MyKeyListener implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
// 打印按键的键码值
System.out.println("键码值:" + keyCode);
// 处理特定的键码值
if (keyCode == KeyEvent.VK_ENTER) {
// 处理回车键的操作
System.out.println("按下了回车键");
} else if (keyCode == KeyEvent.VK_ESCAPE) {
// 处理ESC键的操作
System.out.println("按下了ESC键");
} else {
// 处理其他键码值
}
}
@Override
public void keyReleased(KeyEvent e) {
// 处理释放按键的事件
}
@Override
public void keyTyped(KeyEvent e) {
// 处理按键字符输入的事件
}
}
在上面的代码中,实现了 KeyListener 接口,并重写了它的方法。在 keyPressed() 方法中,使用 e.getKeyCode() 来获取按键的键码值。然后,打印出键码值,并根据定义在 KeyEvent 类中的常量(如 KeyEvent.VK_ENTER 或 KeyEvent.VK_ESCAPE)与特定的键码值进行比较来处理相应的操作。
要使用这个按键监听器,可以将它添加到接收键盘输入的组件上,例如文本框或面板。以下是一个将按键监听器添加到文本框的示例:
import javax.swing.JFrame;
import javax.swing.JTextField;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame("按键监听器示例");
JTextField textField = new JTextField();
// 将按键监听器添加到文本框上
textField.addKeyListener(new MyKeyListener());
frame.add(textField);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
当运行这段代码时,只要文本框具有焦点,按下任意键时 keyPressed() 方法就会被触发。可以根据需要自定义 keyPressed() 方法中的代码来处理不同的键码值。
在图形用户界面(GUI)应用程序中,最好使用Swing或JavaFX等框架提供的更高级的事件处理机制,而不是直接实现 KeyListener 接口。但是为了说明问题,这个示例演示了在简单情境下使用 KeyEvent.getKeyCode() 的用法。
示例代码:
import java.awt.event.KeyEvent;
public class MyKeyListener implements KeyEvent {
@Override
public void keyTyped(KeyEvent e) {
// 获取按键的字符(Unicode 码)
char keyChar = e.getKeyChar();
System.out.println("按下的字符:" + keyChar);
}
@Override
public void keyPressed(KeyEvent e) {
// 获取按键的整数键码值
int keyCode = e.getKeyCode();
System.out.println("按下的键码值:" + keyCode);
}
@Override
public void keyReleased(KeyEvent e) {
// 按键释放事件
}
}
需要注意的是,在 Java 中,字符的表示方式使用 Unicode 码(UTF-16 编码),与 ASCII 码并不完全一致。因此,如果你需要判断按键的字符是否是某个特定的 ASCII 字符,可以通过比较其对应的 Unicode 码值。
在 VB中,还有三个与按键事件相关的事件:KeyDown、KeyUp 和 KeyPress。
在 Visual Basic中,可以使用这三个事件来处理按键事件。以下是一个示例代码:
Private Sub TextBox1_KeyDown(KeyCode As Integer, Shift As Integer)
' 处理键盘按下事件
' ...
End Sub
Private Sub TextBox1_KeyUp(KeyCode As Integer, Shift As Integer)
' 处理键盘释放事件
' ...
End Sub
Private Sub TextBox1_KeyPress(KeyAscii As Integer)
' 处理键盘按下并字符插入事件
' ...
End Sub
在 Java 中,需要实现 KeyListener 接口,并重写相应的方法来监听和处理按键事件。
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class MyKeyListener implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
// 判断按下的键是否是功能键
if (e.isActionKey()) {
// 处理功能键
// ...
} else {
// 处理可打印字符
char keyChar = e.getKeyChar();
// ...
}
}
@Override
public void keyReleased(KeyEvent e) {
// 处理键盘释放事件
// ...
}
@Override
public void keyTyped(KeyEvent e) {
// 处理键盘按下并字符插入事件
// ...
}
}
以上是一个实现了 KeyListener 接口的示例代码。在需要监听按键事件的地方,可以将该监听器注册到对应的组件上,如文本框:
JTextField textField = new JTextField();
textField.addKeyListener(new MyKeyListener());
需要注意的是,在容器类组件(如面板和窗口)默认情况下不支持键盘事件监听,需要手动将焦点设置到该组件上,并添加键盘事件监听器才能生效。
在 VB和 Java 中,都有处理按键事件的 API,但二者之间还是存在一些差别。
在 Java 中,需要通过实现 KeyListener 接口来监听和处理按键事件。该接口定义了三个方法:keyPressed、keyReleased 和 keyTyped。
keyPressed(KeyEvent e) 方法在按键被按下后立即触发。它接收一个 KeyEvent 参数 e,该参数包含有关按键事件的信息。在该方法中,可以通过 e.getKeyCode() 获取按键的整数键码值,通过 e.isActionKey() 判断按键是否是功能键(如方向键、F1~F12 等),通过 e.getKeyChar() 获取按键对应的字符的 Unicode 码,通过 e.getKeyLocation() 获取按键在键盘上的位置等。根据具体需求,可以在该方法中编写相应的逻辑来处理按键事件。
keyReleased(KeyEvent e) 方法在按键被释放后立即触发。同样,它也接收一个 KeyEvent 参数 e,可以使用其中的方法获取按键相关信息。在该方法中,可以处理按键释放后的逻辑,比如重置某些状态或执行其他操作。
keyTyped(KeyEvent e) 方法在按键被按下后,在其对应的字符被插入到文本框或标签等控件中时触发。同样地,它也接收一个 KeyEvent 参数 e,可以使用其中的方法获取按键相关信息。在该方法中,可以处理插入字符后的逻辑,例如限制输入的字符类型、实时显示输入内容等。
在使用 KeyListener 接口时,需要将其注册到相应的组件上,以便监听该组件的按键事件。例如,可以使用 addKeyListener() 方法将 KeyListener 对象添加到文本框控件上,从而监听该文本框的按键事件。
需要注意的是,不是所有的组件都支持键盘事件监听。例如,容器类组件(如面板和窗口)默认情况下不支持键盘事件监听,需要手动将焦点设置到该组件上,并添加键盘事件监听器才能生效。
综上所述,通过实现 KeyListener 接口并重写相应的方法,可以实现在 Java 中监听和处理按键事件的功能。根据具体需求,可以在相应的方法中编写逻辑来响应按键事件,以实现特定的功能。
1、可以使用 KeyAscii 来获取按键的 ASCII 码值。这个概念在 Java 中并不存在,因为 Java 中的字符表示方式使用 Unicode 码。
2、按键事件中常常用到的是 KeyCode 属性。而在 Java 中,则是使用 KeyEvent 类和 getKeyCode() 方法来获取按键的整数键码值。
3、KeyDown、KeyUp 和 KeyPress 事件都是内置的事件,可以直接使用。而在 Java 中,需要实现 KeyListener 接口,并重写相应的方法来监听和处理按键事件。
1、字符的表示方式使用 Unicode 码(UTF-16 编码),与 ASCII 码并不完全一致。因此,如果需要判断按键的字符是否是某个特定的 ASCII 字符,可以通过比较其对应的 Unicode 码值。
2、KeyEvent 类提供了丰富的方式来获取和操作按键事件。例如,isActionKey() 方法可以用来判断一个按键是否是功能键(如方向键、F1~F12 等);getKeyChar() 方法可以获取对应字符的 Unicode 值;getKeyLocation() 方法可以获取按键在键盘上的位置等等。
3、除了 KeyListener 接口外,还提供了一系列专门用于处理特定控件类型的监听器接口,如 MouseListener、WindowListener、ActionListener 等。
综上所述,虽然 VB 和 Java 中都有处理按键事件的 API,但二者之间还是存在一些差别,需要根据具体情况进行选择和使用。
特点 | Visual Basic | Java |
---|---|---|
获取按键的 ASCII 码值 | 使用 KeyAscii | 通过 Unicode 码表示字符 |
获取按键的整数键码值 | 使用 KeyCode 属性 | 使用 KeyEvent 类和 getKeyCode() 方法 |
内置的按键事件 | KeyDown、KeyUp 和 KeyPress 事件 | 需要实现 KeyListener 接口并重写方法 |
字符表示方式 | ASCII 码 | Unicode 码(UTF-16 编码) |
判断功能键 | 无 | 使用 isActionKey() 方法 |
获取按键对应字符的 Unicode 码 | 无 | 使用 getKeyChar() 方法 |
获取按键在键盘上的位置 | 无 | 使用 getKeyLocation() 方法 |
其他监听器接口 | 无 | 提供了一系列专门用于处理特定控件类型的监听器接口 |
容器类组件的键盘事件监听 | 默认不支持 | 需要手动设置焦点并添加键盘事件监听器 |
本文主要讲解了如何通过使用 KeyCode 和 KeyAscii 在 VB中获取按键的键码值和 ASCII 码值,并使用 KeyDown、KeyUp 和 KeyPress 事件来处理按键事件,同时还介绍了在 Java 中,需要实现 KeyListener 接口,并重写相应的方法来监听和处理按键事件。在开发过程中,根据具体需求,可以编写逻辑来响应按键事件,以实现特定的功能。