⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keycanvas.java

📁 J2ME程序设计实例教程的源码
💻 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 + -