📄 keycanvas.java
字号:
import javax.microedition.lcdui.*;
/**
* 该类是一个抽象类,扩展了Canvas类。
* 该类为不支持持续按键动作的设备提供了处理持续按键动作的能力。
*/
public abstract class KeyCanvas extends Canvas {
//
private static final long DELAY = 400; //按键延迟时间
private boolean pressed;
private long pressedTime=0; //第一次按下键的时间
private boolean stop;
private Thread listener; //按键监视线程
private int keyCode;
private MicroKeyListener handler; //按键处理接口
protected void showNotify() {
stop = false;
listener = new KeyThread();
listener.start();
}
protected void hideNotify() {
synchronized(listener) {
stop = true;
pressed = false;
listener.notifyAll();
}
}
//为当前的画布设置一个监视器(MicroKeyListener),如果发生键盘事件,
//那么监视器handler将回调MicroKeyListener接口中的方法。
public void setMicroKeyListener(MicroKeyListener handler) {
this.handler = handler;
}
//
protected final void keyPressed(int keyCode) {
this.keyCode = keyCode;
if(handler != null) {//监视器回调接口中的方法处理按下键事件
handler.microKeyPressed(keyCode);
}
synchronized(listener) {
pressed = true;
pressedTime = System.currentTimeMillis();
listener.notifyAll();
}
}
protected final void keyReleased(int keyCode) {
this.keyCode = keyCode;
if(handler != null) {//监视器回调接口中的方法处理释放键事件
handler.microKeyReleased(keyCode);
}
synchronized(listener) {
pressed = false;
}
}
protected final void keyRepeated(int keyCode) {
//
}
//该线程类用于监视键盘事件
private class KeyThread extends Thread {
//线程执行体
public void run() {
while(!stop) {
try {
synchronized(this) {
while(!stop && !pressed) {
wait();
}
}
int delay = (int)(DELAY - System.currentTimeMillis() + pressedTime);
if(pressed && delay > 0) {
Thread.sleep(delay);
}
while(pressed) {
handler.microKeyRepeated(keyCode);
Thread.sleep(DELAY/5);
}
}
catch(InterruptedException ie) {
System.out.println("Error: " + ie.toString());
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -