0

我有一个用于键盘轮询的简单单例,它实现 keyListener 只是为了改变布尔值的状态。我通过 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;
}
4

2 回答 2

0

我认为您的单身人士没有问题,我只是不确定其中的代码。

与其为 Key Up/Down 创建两个单独的布尔数组,不如实现一个KeyProcessor.

每当收到关键事件时,发送keycodeKeyporcessor与它相关联的操作

例如

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

现在创建一个命令映射,其中您将拥有使用 keycode & command 构造的键的 Hashmap。

Hashmap.put(keycode, PROCCESS_KEY_A)

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

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

于 2012-08-22T10:30:48.990 回答
0

我要问的第一件事是为什么您的枚举不实现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) {}
}
于 2012-08-22T10:40:21.273 回答