实现keyListener的枚举单例



我有一个用于键盘轮询的简单单例,它实现keyListener只是为了更改布尔值的状态。我通过getgetKeyListener()获取keyListener对象。我不确定这是否是可行的,但代码是有效的。可能有更好的方法来实现这一点吗?

更新:使用位集轮询密钥输入的更简单方法

package Singleton;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.BitSet;
public enum bitKeyProcessor implements KeyListener{
INSTANCE;
private final BitSet bitset = new BitSet();
@Override
public void keyPressed(KeyEvent e) {
    bitset.set(e.getKeyCode());
}
@Override
public void keyReleased(KeyEvent e) {
    try{bitset.clear(e.getKeyCode());}
    catch(Exception ex) {ex.printStackTrace();}
}
public void keyTyped(KeyEvent e) {};
public boolean isUp(){
    if(bitset.get(KeyEvent.VK_UP))
        return true;    
    return false;
}
....
public boolean isUpRight(){
    if( isUp() && isRight())
        return true;
    return false;
}

我要问的第一件事是,为什么您的枚举不实现KeyListener接口本身?这将使您的代码更具可读性,并消除对静态的任何需求(当然,除了INSTANCE)。

enum eSingleton implements KeyListener {
    INSTANCE;
    private boolean[] keyUp = new boolean[256];
    private boolean[] keyDown = new boolean[256];
    private boolean listen;
    public void update(){
        keyUp = new boolean[256];
    }
    public void listen(final boolean startStop){
        listen = startStop;
    }
    public boolean isKeyUp(int key){
        return keyUp[key];
    }
    public boolean isKeyDown(int key){
        return keyDown[key];
    }
    @Override
    public void keyPressed(KeyEvent e) {
        keyUp[e.getKeyCode()] = false;
        keyDown[e.getKeyCode()] = true;
    }
    @Override
    public void keyReleased(KeyEvent e) {
        keyUp[e.getKeyCode()] = true;
        keyDown[e.getKeyCode()] = false;
    }
    @Override
    public void keyTyped(KeyEvent e) {}
}

我不认为你的单例有问题,我只是不确定里面的代码。

与其为KeyUp/Down创建两个单独的布尔数组,为什么不实现KeyProcessor呢。

每当接收到关键事件时,将keycode发送到Keyporcessor,并将动作与其关联

例如

  KeyProcessor.sendKeyEvent(keycode, PRESSED);
  KeyProcessor.sendKeyEvent(keycode, RELEASED);
  KeyProcessor.sendKeyEvent(keycode, TYPED);

现在创建一个命令映射,在该命令映射中,您将拥有使用keycode&命令

Hashmap.put(keycode, PROCCESS_KEY_A)
enum command
{
PROCCESS_KEY_A;
pressed(){};
released(){};
typed(){};
}

sendKeyEvent将根据从命令映射中检索到的enum的关键事件来调用方法。

最新更新