枚举单例实现keyListener

时间:2012-08-22 08:16:13

标签: java interface singleton

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

更新:使用bitset

轮询键输入的更简单方法
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;
}

2 个答案:

答案 0 :(得分:0)

我认为你的单身人士没有问题我只是不确定里面的代码。

不是为Key Up / Down创建两个单独的布尔数组,而是为什么不实现KeyProcessor

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

e.g。

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

现在创建一个命令映射,在该命令映射中,您将使用键码和&amp ;;命令。

Hashmap.put(keycode, PROCCESS_KEY_A)

enum command
{
PROCCESS_KEY_A;
pressed(){};
released(){};
typed(){};
}

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

答案 1 :(得分:0)

我要问的第一件事是你的enum为什么不实现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) {}
}