效果
前言
从键盘上输入一个字符,比如26个英文字母中的一个,然后使用键盘的方向键对其进行进行移动,可以向上向下向左向右移动字符。
代码
package Test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class TestFrame extends JFrame {
private KeyboardPanel keyboardPanel=new KeyboardPanel();
public TestFrame(){
add(keyboardPanel);
keyboardPanel.setFocusable(true);
}
public static void main(String[] args) {
TestFrame frame=new TestFrame();
frame.setTitle("Exercise15_1");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(900,300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
static class KeyboardPanel extends JPanel{
private int x=100;
private int y=100;
private char keyChar='A';//默认字母
public KeyboardPanel(){
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN:y+=10;break;
case KeyEvent.VK_UP:y-=10;break;
case KeyEvent.VK_LEFT:x-=10;break;
case KeyEvent.VK_RIGHT:x+=10;break;
default:keyChar=e.getKeyChar();
}
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setFont(new Font("TimesRoman",Font.PLAIN,24));
g.drawString(String.valueOf(keyChar),x,y);
}
}
}
思路解析
键盘事件的监听设为主类的内部类,因为他不引用主类中任何实例成员。
扩展KeyAdapter可以用来处理按键的输入,重写它的KeyPressed方法,即处理按键输入后的事件。
KeyEvent类封装了关于按键事件的信息,其中有一些按键的常量
常量 | 描述 |
---|---|
VK_HOME | Home键 |
VK_End | End键 |
VK_PGDN | Page Up键 |
VK_PGDN | Page Down键 |
VK_UP | 上箭头 |
VK_DOWN | 下箭头 |
VK_LEFT | 左箭头 |
VK_RIGHT | 右箭头 |
VK_ESCAPE | Esc键 |
VK_TAB | Tab键 |
VK_CONTROL | Ctrl键 |
VK_SHIFT | Shift键 |
VK_BACK_SPACE | 空格键 |
VK_CAPS_LOCK | 大写字母锁定键 |
VK_NUM_LCOK | 数字键盘锁定键 |
VK_ENTER | 回车键 |
VK_UNDEFINED | 按键代码位置 |
VK_F1~VK_F12 | 从F1~F12的功能键 |
VK_0~VK_9 | 从0~9的数字键 |
VK_A~VK_Z | 从A到Z的数字键 |
对于按下按键和释放按键事件(getKeyPressed()和getKeyReleased()),getKeyCode()返回定义在表中的值。
对于按键敲击事件,getKeyCode()返回VK_UNDEFINED,而getKeyChar()返回输入的字符。
重写KeyPressed方法中,判定传递来的表中的值,让字符在表中绘制的坐标发生变化。
public KeyboardPanel(){
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN:y+=10;break;
case KeyEvent.VK_UP:y-=10;break;
case KeyEvent.VK_LEFT:x-=10;break;
case KeyEvent.VK_RIGHT:x+=10;break;
default:keyChar=e.getKeyChar();
}
repaint();
}
});
}
这里的x,y是内部类的私有成员,用于绘制字符串的位置
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setFont(new Font("TimesRoman",Font.PLAIN,24));
g.drawString(String.valueOf(keyChar),x,y);
}
由此,每次按下鼠标的上下左右键后,都会被按键事件捕捉到,然后对坐标进行相应的处理,调用repaint()方法,重新再屏幕上绘制字符,因为绘制的速度很快,所以显得好像这个字符动起来了一样。
keyboardPanel.setFocusable(true);
是设置焦点状态,如果没有设置默认为false,键盘是无法集中焦点去移动当前的字符的。
说到字符,这里的输入如果不是上下左右键,那么就把当前的字符绘制到屏幕上。
版权声明:本文为qq_43576028原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。